Ruby で時差を求める

## 概要

- Ruby で時差を求めるサンプルコード3つ (やってる処理内容はあまり変わらない)
- Time クラスを利用する → [class Time \(Ruby 2\.5\.0\)](https://docs.ruby-lang.org/ja/latest/class/Time.html)

## UTC と JST と EST の時差を感じるサンプル

イギリスと日本とアメリカの時差を感じる。

[時間帯 \(標準時\) \- Wikipedia](https://ja.wikipedia.org/wiki/%E6%99%82%E9%96%93%E5%B8%AF_(%E6%A8%99%E6%BA%96%E6%99%82))

> 共通の標準時を使う地域全体を「標準時間帯」、「時間帯」、「等時帯」または「タイムゾーン(time zone)」といい、その地域の標準時を示す際にはUTCとの差で示すことが多い。

[協定世界時 \- Wikipedia](https://ja.wikipedia.org/wiki/%E5%8D%94%E5%AE%9A%E4%B8%96%E7%95%8C%E6%99%82)

> 世界各地の標準時は協定世界時を基準としている。日本標準時 (JST)は協定世界時よりも9時間早く「+0900 (JST)」と表記する。

[日本標準時 \- Wikipedia](https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E6%A8%99%E6%BA%96%E6%99%82)

> 日本標準時（にほんひょうじゅんじ、英語: Japan Standard Time、略語：JST）は、国立研究開発法人情報通信研究機構の原子時計で生成・供給される協定世界時（UTC）を9時間（東経135度分の時差）進めた時刻（すなわちUTC+9）をもって、日本における標準時としたものである。

[東部標準時 \- Wikipedia](https://ja.wikipedia.org/wiki/%E6%9D%B1%E9%83%A8%E6%A8%99%E6%BA%96%E6%99%82)

> 東部標準時（とうぶひょうじゅんじ、英語: Eastern Standard Time: 略称EST、または、英語: Eastern Time Zone）は、協定世界時 (UTC) を5時間遅らせた標準時である。「-0500(EST)」のように表示する。
> 
> なお、夏時間では協定世界時より4時間遅れ、東部夏時間（Eastern Daylight Time: 略称EDT）と呼ばれている。
> 
> つまり、通常では日本より14時間遅れ、夏時間採用時のみ13時間遅れている。
> 
> （アラスカ州・ハワイ州を除いた）アメリカ合衆国本土にある4つの時間帯のうち一番先行する時間帯で、首都ワシントンD.C.やニューヨーク市のほか、東海岸の諸都市がこの時間帯に属する。カナダでは首都オタワ、モントリオール、トロントなど主要都市部がこの時間帯に属する。

### ソースコード

```
require 'time'

# ロンドン
puts 'UTC (協定世界時)'
utc = Time.utc(1970)
puts 'ロンドン: ' + utc.strftime('%Y-%m-%d %H:%M:%S %z')
puts

# 東京
puts 'JST: Japan Standard Time (日本標準時)'
jst = utc.getlocal('+09:00')
puts '東京: ' + jst.strftime('%Y-%m-%d %H:%M:%S %z')
puts

# ニューヨーク
puts 'EST: Eastern Standard Time (東部標準時)'
est = utc.getlocal('-05:00')
puts 'ニューヨーク' + est.strftime('%Y-%m-%d %H:%M:%S %z')
puts
```

### 実行結果

```
UTC (協定世界時)
ロンドン: 1970-01-01 00:00:00 +0000

JST: Japan Standard Time (日本標準時)
東京: 1970-01-01 09:00:00 +0900

EST: Eastern Standard Time (東部標準時)
ニューヨーク1969-12-31 19:00:00 -0500
```

## 国際的な時間感覚を把握するサンプル

ライン諸島は地球上で1番早く日付が変わる場所。

[ライン諸島 \- Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%B3%E8%AB%B8%E5%B3%B6)

> ライン諸島（ラインしょとう、Line Islands）とはハワイ諸島の南の中部太平洋にある、大部分が環礁からなる諸島。アメリカ合衆国が領有する一部の島を除いてキリバスの領有であり、ライン諸島はキリバスの最東端に位置する。
> 
> ライン諸島のタイムゾーンはUTC+14 で、ハワイと時間は同じだが日付は1日進んでいる。

### ソースコード

```
require 'time'

def xday(b, t)
  base   = Date.new(b.year, b.month, b.day)
  target = Date.new(t.year, t.month, t.day)
  return '翌日の' if base < target
  return '前日の' if base > target
  return '同日の'
end

(0..23).each do |hour|
  tokyo   = Time.new(2018, 1, 1, hour, 0, 0, '+09:00')
  london  = tokyo.getlocal('+00:00')
  newyork = tokyo.getlocal('-05:00')
  line    = tokyo.getlocal('+14:00')
  puts "東京が#{tokyo.strftime('%k')}時のとき、" +
    "ロンドンは#{xday(tokyo, london)}#{london.strftime('%k')}時、" +
    "ニューヨークは#{xday(tokyo, newyork)}#{newyork.strftime('%k')}時、" +
    "ライン諸島は#{xday(tokyo, line)}#{line.strftime('%k')}時"
end
```

### 実行結果

```
東京が 0時のとき、ロンドンは前日の15時、ニューヨークは前日の10時、ライン諸島は同日の 5時
東京が 1時のとき、ロンドンは前日の16時、ニューヨークは前日の11時、ライン諸島は同日の 6時
東京が 2時のとき、ロンドンは前日の17時、ニューヨークは前日の12時、ライン諸島は同日の 7時
東京が 3時のとき、ロンドンは前日の18時、ニューヨークは前日の13時、ライン諸島は同日の 8時
東京が 4時のとき、ロンドンは前日の19時、ニューヨークは前日の14時、ライン諸島は同日の 9時
東京が 5時のとき、ロンドンは前日の20時、ニューヨークは前日の15時、ライン諸島は同日の10時
東京が 6時のとき、ロンドンは前日の21時、ニューヨークは前日の16時、ライン諸島は同日の11時
東京が 7時のとき、ロンドンは前日の22時、ニューヨークは前日の17時、ライン諸島は同日の12時
東京が 8時のとき、ロンドンは前日の23時、ニューヨークは前日の18時、ライン諸島は同日の13時
東京が 9時のとき、ロンドンは同日の 0時、ニューヨークは前日の19時、ライン諸島は同日の14時
東京が10時のとき、ロンドンは同日の 1時、ニューヨークは前日の20時、ライン諸島は同日の15時
東京が11時のとき、ロンドンは同日の 2時、ニューヨークは前日の21時、ライン諸島は同日の16時
東京が12時のとき、ロンドンは同日の 3時、ニューヨークは前日の22時、ライン諸島は同日の17時
東京が13時のとき、ロンドンは同日の 4時、ニューヨークは前日の23時、ライン諸島は同日の18時
東京が14時のとき、ロンドンは同日の 5時、ニューヨークは同日の 0時、ライン諸島は同日の19時
東京が15時のとき、ロンドンは同日の 6時、ニューヨークは同日の 1時、ライン諸島は同日の20時
東京が16時のとき、ロンドンは同日の 7時、ニューヨークは同日の 2時、ライン諸島は同日の21時
東京が17時のとき、ロンドンは同日の 8時、ニューヨークは同日の 3時、ライン諸島は同日の22時
東京が18時のとき、ロンドンは同日の 9時、ニューヨークは同日の 4時、ライン諸島は同日の23時
東京が19時のとき、ロンドンは同日の10時、ニューヨークは同日の 5時、ライン諸島は翌日の 0時
東京が20時のとき、ロンドンは同日の11時、ニューヨークは同日の 6時、ライン諸島は翌日の 1時
東京が21時のとき、ロンドンは同日の12時、ニューヨークは同日の 7時、ライン諸島は翌日の 2時
東京が22時のとき、ロンドンは同日の13時、ニューヨークは同日の 8時、ライン諸島は翌日の 3時
東京が23時のとき、ロンドンは同日の14時、ニューヨークは同日の 9時、ライン諸島は翌日の 4時
```

## 具体的な日付と場所を列挙するサンプル

### ソースコード

```
require 'time'

(0..23).each do |hour|
  tokyo   = Time.new(2018, 1, 1, hour, 0, 0, '+09:00')
  london  = tokyo.getlocal('+00:00')
  newyork = tokyo.getlocal('-05:00')
  line    = tokyo.getlocal('+14:00')
  puts "#{tokyo.strftime('%Y年%_m月%_d日%_H時')}: 東京"
  puts "#{london.strftime('%Y年%_m月%_d日%_H時')}: ロンドン"
  puts "#{newyork.strftime('%Y年%_m月%_d日%_H時')}: ニューヨーク"
  puts "#{line.strftime('%Y年%_m月%_d日%_H時')}: ライン諸島"
  puts ''
end
```

### 実行結果

```
2018年 1月 1日 0時: 東京
2017年12月31日15時: ロンドン
2017年12月31日10時: ニューヨーク
2018年 1月 1日 5時: ライン諸島

2018年 1月 1日 1時: 東京
2017年12月31日16時: ロンドン
2017年12月31日11時: ニューヨーク
2018年 1月 1日 6時: ライン諸島

2018年 1月 1日 2時: 東京
2017年12月31日17時: ロンドン
2017年12月31日12時: ニューヨーク
2018年 1月 1日 7時: ライン諸島

2018年 1月 1日 3時: 東京
2017年12月31日18時: ロンドン
2017年12月31日13時: ニューヨーク
2018年 1月 1日 8時: ライン諸島

2018年 1月 1日 4時: 東京
2017年12月31日19時: ロンドン
2017年12月31日14時: ニューヨーク
2018年 1月 1日 9時: ライン諸島

2018年 1月 1日 5時: 東京
2017年12月31日20時: ロンドン
2017年12月31日15時: ニューヨーク
2018年 1月 1日10時: ライン諸島

2018年 1月 1日 6時: 東京
2017年12月31日21時: ロンドン
2017年12月31日16時: ニューヨーク
2018年 1月 1日11時: ライン諸島

2018年 1月 1日 7時: 東京
2017年12月31日22時: ロンドン
2017年12月31日17時: ニューヨーク
2018年 1月 1日12時: ライン諸島

2018年 1月 1日 8時: 東京
2017年12月31日23時: ロンドン
2017年12月31日18時: ニューヨーク
2018年 1月 1日13時: ライン諸島

2018年 1月 1日 9時: 東京
2018年 1月 1日 0時: ロンドン
2017年12月31日19時: ニューヨーク
2018年 1月 1日14時: ライン諸島

2018年 1月 1日10時: 東京
2018年 1月 1日 1時: ロンドン
2017年12月31日20時: ニューヨーク
2018年 1月 1日15時: ライン諸島

2018年 1月 1日11時: 東京
2018年 1月 1日 2時: ロンドン
2017年12月31日21時: ニューヨーク
2018年 1月 1日16時: ライン諸島

2018年 1月 1日12時: 東京
2018年 1月 1日 3時: ロンドン
2017年12月31日22時: ニューヨーク
2018年 1月 1日17時: ライン諸島

2018年 1月 1日13時: 東京
2018年 1月 1日 4時: ロンドン
2017年12月31日23時: ニューヨーク
2018年 1月 1日18時: ライン諸島

2018年 1月 1日14時: 東京
2018年 1月 1日 5時: ロンドン
2018年 1月 1日 0時: ニューヨーク
2018年 1月 1日19時: ライン諸島

2018年 1月 1日15時: 東京
2018年 1月 1日 6時: ロンドン
2018年 1月 1日 1時: ニューヨーク
2018年 1月 1日20時: ライン諸島

2018年 1月 1日16時: 東京
2018年 1月 1日 7時: ロンドン
2018年 1月 1日 2時: ニューヨーク
2018年 1月 1日21時: ライン諸島

2018年 1月 1日17時: 東京
2018年 1月 1日 8時: ロンドン
2018年 1月 1日 3時: ニューヨーク
2018年 1月 1日22時: ライン諸島

2018年 1月 1日18時: 東京
2018年 1月 1日 9時: ロンドン
2018年 1月 1日 4時: ニューヨーク
2018年 1月 1日23時: ライン諸島

2018年 1月 1日19時: 東京
2018年 1月 1日10時: ロンドン
2018年 1月 1日 5時: ニューヨーク
2018年 1月 2日 0時: ライン諸島

2018年 1月 1日20時: 東京
2018年 1月 1日11時: ロンドン
2018年 1月 1日 6時: ニューヨーク
2018年 1月 2日 1時: ライン諸島

2018年 1月 1日21時: 東京
2018年 1月 1日12時: ロンドン
2018年 1月 1日 7時: ニューヨーク
2018年 1月 2日 2時: ライン諸島

2018年 1月 1日22時: 東京
2018年 1月 1日13時: ロンドン
2018年 1月 1日 8時: ニューヨーク
2018年 1月 2日 3時: ライン諸島

2018年 1月 1日23時: 東京
2018年 1月 1日14時: ロンドン
2018年 1月 1日 9時: ニューヨーク
2018年 1月 2日 4時: ライン諸島
```