Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

8

Share

Download to read offline

グローバル化はなぜ日時処理問題を引き起こすのか

Download to read offline

「『プログラミング .NET Framework 第4版 』座談会」発表資料です。
http://atnd.org/event/E0019986/0

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

グローバル化はなぜ日時処理問題を引き起こすのか

  1. 1. グローバル化はなぜ 日時処理問題を 引き起こすのか Titled by ホッテントリメーカー @atsukanrock 2013/10/26 C#ユーザー会
  2. 2. @atsukanrock http://d.hatena.ne.jp/atsukanrock/ Enterprise Application Architect になりたい DDD Lover
  3. 3. @atsukanrock http://d.hatena.ne.jp/atsukanrock/ Enterprise Application Architect になりたい DDD Lover http://jigokuno.com/?eid=162
  4. 4. ゴール
  5. 5. この辺を伝えたい: • 時差とは? • タイムゾーンとは? • UTC とは? • 夏時間とは? • .NET での日時処理
  6. 6. 時差
  7. 7. 外資系あるある
  8. 8. ピンチ!! 外人からメール来た!!
  9. 9. トレーニングのお誘いかー 28 日の 7 時から… もー!はえーよー!!
  10. 10. ε-(´∀`*)ホッ 解読成功♪
  11. 11. ファッ!?
  12. 12. 7 時じゃなくて 23 時!?
  13. 13. 時差のせいです。
  14. 14. 時差 カリフォルニアとか アメリカ西海岸では 7:00 東京では 23:00
  15. 15. タイムゾーン 男闘呼組じゃないよ
  16. 16. 東京の僕たちが 23 時に酒を飲んでいる頃 California の Charles は 7 時に Bacon Eggの Breakfast を Eating
  17. 17. 僕たちは東京標準時 (Tokyo Standard Time (UTC+9)) に生きていて Charles は太平洋夏時間 (Pacific Daylight Time (UTC-7)) に生きている
  18. 18. タイムゾーンとはこの: •東京標準時 •太平洋夏時間 とかのことで、 タイムゾーンが違うと 同じ瞬間なのに時刻が違う
  19. 19. タイムゾーンあるある
  20. 20. I永さん: 2013/10/26 13:00 から C# ユーザー会やります!!
  21. 21. Charles: Hey, どの Time Zone だい?
  22. 22. ただ「2013/10/25 13:00」 と言っても どのタイムゾーンかによって どの瞬間かが異なる
  23. 23. 様々なタイムゾーンの 基準になる時間が ないと何かと不便
  24. 24. そこで考えだされたのが UTC 1963年発足らしい
  25. 25. すべてのタイムゾーンは UTC を基準にして 何時間進んでいるか or 何時間遅れているか で表される
  26. 26. 進んでる 東京標準時:UTC+9 太平洋夏時間:UTC-7 遅れてる
  27. 27. プログラムの世界では UTC のおかげで とても楽になる
  28. 28. Charles (非 UTC Ver.): Tokyo を 9 am に Departure して California に 7 am に Arrive したんだよ 何時間かかったか 分からない
  29. 29. Charles (UTC Ver.): Tokyo を 12 am に Departure して California に 2 PM に Arrive したんだよ 14時間かかったんだね おつかれさま
  30. 30. 時刻を全て UTC で表せば 瞬間に基づく: •足し算や引き算 •比較 •並べ替え が簡単になる
  31. 31. lヽ ノ l ll lヽ ヽ )'ーーノ( | | | 、 / l| l ハヽ |ー‐''"l / U | | |/| ハ / / ,/ /|ノ /l / l l l| l U ヽ l ・ i´ | ヽ、| |r|| | //--‐'" `'メ、_lノ| / ・ / | T l トー-トヽ| |ノ ''"´` rー-/// | T | | ・ |/ | l ||、 ''""" j ""''/ | |ヽl ・ | | C | | l | ヽ, ― / || l C | | !! | / ||| ` ー-‐ ' ´|| ,ノ| || !! | ノー‐---、,| / │l、l |レ' ,ノノ ノハ、_ノヽ / / ノ⌒ヾ、 ヽ ノハ, | ,/ ,イーf'´ /´ \ | ,/´ |ヽl | /-ト、| ┼―- 、_ヽメr' , -=l''"ハ | l ,/ | ヽ \ _,ノーf' ´ ノノ ヽ | | 、_ _ ‐''l `ー‐―''" ⌒'ー--‐'´`ヽ、_ _,ノ ノ  ̄ ̄ | /
  32. 32. 夏時間
  33. 33. Charles: Listen してくれ、 Today から DST なんだ。
  34. 34. DST: Daylight Saving Time •日本語では夏時間 •先ほどから登場している「太平 洋夏時間」は「太平洋標準 時」の DST
  35. 35. 例えば Charles が住んでいる California では 次の 2 つを使い分ける: •太平洋夏時間:UTC-7 => 3 月から 11 月 (夏) •太平洋標準時:UTC-8 => 11 月から 3 月 (冬)
  36. 36. 3 月に夏時間に切り替える時 時計の針を 1 時間進める ↓ 時間がスキップされる 1:59:59の1秒後が3:00:00!!
  37. 37. 11 月に標準時間に切り替える時 時計の針を 1 時間戻す ↓ 時間が繰り返す 1時から2時が2回!!
  38. 38. この •スキップされる時間 •繰り返す時間 は .NET の世界でとても厄介な問題 を引き起こします…。 後ほど
  39. 39. .NET での日時処理
  40. 40. ポイントになる型: •DateTime •DateTimeOffset •TimeZoneInfo
  41. 41. DateTime •.NET 1.1 からある •素朴な日時型 •時差、タイムゾーン、夏時間サ ポートなし
  42. 42. DateTime (おそらく時差、タイムゾーンサ ポートのため) .NET 2.0 (SP1?) で Kind プロパティが追加された ↓ 使えない。ていうか邪魔
  43. 43. DateTime.Kind DateTime の基準を表す: •Utc:UTC •Local:現地時刻 •Unspecified:未指定 ただし具体的にどのタイムゾーンかは 分からない (= 使えない)
  44. 44. DateTime.Kind ちょくちょく邪魔する: • TimeZoneInfo の UTC => Local 変換メソッドに Kind が Local の DateTime を渡したら 死亡 ※DateTime.(Today|Now) の Kind は Local • WCF のクライアントとサーバーのタイムゾーン が異なり、受け渡す DateTime の Kind が Local だと、時差に応じて勝手に値が変換され る
  45. 45. DateTime.Kind 結論: 認知度低いくせにちょくちょく邪魔する ↓ 対策: プロジェクト内で認知度高めてバグを防ぎま しょう/(^o^)\
  46. 46. DateTimeOffset •.NET 3.5 からできた •MS 的には「DateTime よりこっち推奨」 •日時の値に加えて UTC からの時差情 報も持つ => 時差、タイムゾーンを部分 的にサポート •夏時間はサポートなし •SQL Server なら DateTimeOffset 型あり
  47. 47. DateTimeOffset 例:Charlesの移動時間問題 Tokyo を 9 am (UTC+9) に Departure して California に 7 am (UTC-7) に Arrive ↓ DateTimeOffset なら普通に引き算可能 new DateTimeOffset(2013, 5, 28, 7, 0, 0, TimeSpan.FromHours(-7d)) – new DateTimeOffset(2013, 5, 28, 9, 0, 0, TimeSpan.FromHours(9d))
  48. 48. DateTimeOffset •結局 UTC との時差情報は DateTimeOffset の外から与える必要あり •DateTimeOffset 自身はローカルシステム のタイムゾーンの時差情報しか調べら れない。別タイムゾーンの時差情報は 外から与えることになる
  49. 49. DateTimeOffset 結論: DateTime より有能だけど、グローバル対 応 (ローカルシステム以外のタイムゾーン を扱う) プログラムでは補助が必要
  50. 50. TimeZoneInfo •.NET 3.5 から •タイムゾーン情報を得るためのオブジェ クト •世界中のタイムゾーンを扱ったり、夏 時間をサポートするにはこのクラスしか ない
  51. 51. TimeZoneInfo •ConvertTimeToUtc:Local => Utc 変換 •ConvertTimeFromUtc:Utc => Local 変換 •GetUtcOffset:指定された日時における UTC との時差を返す ※夏時間にも対 応 => DateTimeOffset に外から与える時差 情報はこれで取れる!!
  52. 52. ここまでのまとめ というわけで •DateTime は窓から投げ捨てて DateTimeOffset を使おう!! •ローカルシステム以外のタイムゾーンの 時差情報は TimeZoneInfo.GetUtcOffset で 取得!! メデタシメデタシ…
  53. 53. と思わせておいて まだ未解決問題があります。 覚えてますか…?
  54. 54. スキップされる時間 標準時間  夏時間 切り替え問題 繰り返す時間
  55. 55. スキップされる時間 •.NET では Invalid Time と呼ぶ •TimeZoneInfo クラスに IsInvalidTime メソッド がある DST (UTC-1) Local Time 00:00 01:00 02:00 03:00 04:00 03:00 04:00 05:00 Invalid Time UTC 02:00 03:00
  56. 56. スキップされる時間 TimeZoneInfo クラスの Local Time を欲しがっ ているメソッドに Invalid Time を渡すと容赦 なく死ぬ。例えば: •ConvertTimeToUtc •IsDaylightSavingTime
  57. 57. 繰り返す時間 •.NET では Ambiguous Time と呼ぶ •TimeZoneInfo クラスに IsAmbiguousTime メ ソッドがある Standard (UTC-2) Local Time 00:00 01:00 02:00 -> 01:00 02:00 03:00 04:00 05:00 Ambiguous Time UTC 01:00 02:00 03:00
  58. 58. 繰り返す時間 •TimeZoneInfo.ConvertTimeToUtc メソッドに Ambiguous Time を渡したら、標準時間だ と仮定して変換される Standard (UTC-2) Local Time 00:00 01:00 02:00 -> 01:00 02:00 03:00 Ambiguous Time .NET:こっちやろ UTC 01:00 02:00 03:00 04:00 05:00
  59. 59. スキップされる時間再び TimeZoneInfo クラスに IsInvalidTime メソッドは あるが、Invalid Time の範囲を調べるメソッ ドがない (公開されてない) 作るしかない 作りますた (http://pastebin.com/GX3EYKbG) システムが Invalid Time を自動訂正で きる
  60. 60. ちょびっと DB 設計
  61. 61. 複数のタイムゾーンを扱うシステムで DB に日時をどう保存するか
  62. 62. 2 つの選択肢 A) UTC で保存 B) DateTimeOffset で保存 A 案でよさげ
  63. 63. DB には UTC で保存 根拠: • プログラムでの UTC の扱いやすさ (前述) • DB の値が Invalid/Ambiguous Time でないことが 保証される (UTC => Local 変換は失敗しな い) • DateTimeOffset だと、結局夏時間対応のた め別フィールドでタイムゾーン情報を持つ 必要がある
  64. 64. DB には UTC で保存 しんどいところ: • DB を検索する時も DB に保存する時も Local => UTC 変換が必要。となると Invalid/Ambiguous Time 対応が必要になる ※DateTimeOffset でも必要なのは同じ
  65. 65. 質疑応答
  • tra021

    Aug. 11, 2018
  • matthew238

    Feb. 2, 2017
  • pmonster

    Nov. 22, 2016
  • hideshi_o

    Mar. 29, 2015
  • DaiMatsui

    Jan. 26, 2015
  • nagasama

    Jul. 26, 2014
  • okaniwa

    Nov. 8, 2013
  • OWASHIKazunori

    Nov. 5, 2013

「『プログラミング .NET Framework 第4版 』座談会」発表資料です。 http://atnd.org/event/E0019986/0

Views

Total views

5,090

On Slideshare

0

From embeds

0

Number of embeds

693

Actions

Downloads

16

Shares

0

Comments

0

Likes

8

×