SlideShare una empresa de Scribd logo
1 de 66
Descargar para leer sin conexión
グローバル化はなぜ
日時処理問題を
引き起こすのか
Titled by ホッテントリメーカー

@atsukanrock
2013/10/26
C#ユーザー会
@atsukanrock
http://d.hatena.ne.jp/atsukanrock/

Enterprise Application Architect
になりたい

DDD Lover
@atsukanrock
http://d.hatena.ne.jp/atsukanrock/

Enterprise Application Architect
になりたい

DDD Lover
http://jigokuno.com/?eid=162
ゴール
この辺を伝えたい:
• 時差とは?
• タイムゾーンとは?
• UTC とは?
• 夏時間とは?
• .NET での日時処理
時差
外資系あるある
ピンチ!!
外人からメール来た!!
トレーニングのお誘いかー
28 日の 7 時から…
もー!はえーよー!!
ε-(´∀`*)ホッ
解読成功♪
ファッ!?
7 時じゃなくて 23 時!?
時差のせいです。
時差

カリフォルニアとか

アメリカ西海岸では 7:00
東京では 23:00
タイムゾーン
男闘呼組じゃないよ
東京の僕たちが
23 時に酒を飲んでいる頃

California の Charles は
7 時に Bacon Eggの
Breakfast を Eating
僕たちは東京標準時
(Tokyo Standard Time (UTC+9))
に生きていて
Charles は太平洋夏時間
(Pacific Daylight Time (UTC-7))
に生きている
タイムゾーンとはこの:
•東京標準時
•太平洋夏時間
とかのことで、
タイムゾーンが違うと
同じ瞬間なのに時刻が違う
タイムゾーンあるある
I永さん:
2013/10/26 13:00 から
C# ユーザー会やります!!
Charles:
Hey, どの Time Zone だい?
ただ「2013/10/25 13:00」
と言っても
どのタイムゾーンかによって
どの瞬間かが異なる
様々なタイムゾーンの
基準になる時間が
ないと何かと不便
そこで考えだされたのが UTC
1963年発足らしい
すべてのタイムゾーンは
UTC を基準にして
何時間進んでいるか
or 何時間遅れているか
で表される
進んでる

東京標準時:UTC+9
太平洋夏時間:UTC-7
遅れてる
プログラムの世界では
UTC のおかげで
とても楽になる
Charles (非 UTC Ver.):
Tokyo を 9 am に Departure して
California に 7 am に Arrive
したんだよ
何時間かかったか
分からない
Charles (UTC Ver.):
Tokyo を 12 am に Departure して
California に 2 PM に Arrive
したんだよ
14時間かかったんだね
おつかれさま
時刻を全て UTC で表せば
瞬間に基づく:
•足し算や引き算
•比較
•並べ替え
が簡単になる
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 `ー‐―''" ⌒'ー--‐'´`ヽ、_
_,ノ ノ
 ̄ ̄
|
/
夏時間
Charles:
Listen してくれ、
Today から DST なんだ。
DST: Daylight Saving Time
•日本語では夏時間
•先ほどから登場している「太平
洋夏時間」は「太平洋標準
時」の DST
例えば Charles が住んでいる
California では
次の 2 つを使い分ける:
•太平洋夏時間:UTC-7
=> 3 月から 11 月 (夏)

•太平洋標準時:UTC-8
=> 11 月から 3 月 (冬)
3 月に夏時間に切り替える時
時計の針を 1 時間進める
↓
時間がスキップされる
1:59:59の1秒後が3:00:00!!
11 月に標準時間に切り替える時
時計の針を 1 時間戻す
↓
時間が繰り返す
1時から2時が2回!!
この
•スキップされる時間
•繰り返す時間
は .NET の世界でとても厄介な問題
を引き起こします…。
後ほど
.NET での日時処理
ポイントになる型:
•DateTime
•DateTimeOffset
•TimeZoneInfo
DateTime
•.NET 1.1 からある
•素朴な日時型
•時差、タイムゾーン、夏時間サ
ポートなし
DateTime
(おそらく時差、タイムゾーンサ
ポートのため) .NET 2.0 (SP1?) で Kind
プロパティが追加された
↓
使えない。ていうか邪魔
DateTime.Kind
DateTime の基準を表す:
•Utc:UTC
•Local:現地時刻
•Unspecified:未指定
ただし具体的にどのタイムゾーンかは
分からない (= 使えない)
DateTime.Kind
ちょくちょく邪魔する:
• TimeZoneInfo の UTC => Local 変換メソッドに
Kind が Local の DateTime を渡したら 死亡
※DateTime.(Today|Now) の Kind は Local
• WCF のクライアントとサーバーのタイムゾーン
が異なり、受け渡す DateTime の Kind が Local
だと、時差に応じて勝手に値が変換され
る
DateTime.Kind
結論:
認知度低いくせにちょくちょく邪魔する
↓
対策:
プロジェクト内で認知度高めてバグを防ぎま
しょう/(^o^)\
DateTimeOffset
•.NET 3.5 からできた
•MS 的には「DateTime よりこっち推奨」
•日時の値に加えて UTC からの時差情
報も持つ => 時差、タイムゾーンを部分
的にサポート
•夏時間はサポートなし
•SQL Server なら DateTimeOffset 型あり
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))
DateTimeOffset
•結局 UTC との時差情報は DateTimeOffset
の外から与える必要あり
•DateTimeOffset 自身はローカルシステム
のタイムゾーンの時差情報しか調べら
れない。別タイムゾーンの時差情報は
外から与えることになる
DateTimeOffset
結論:
DateTime より有能だけど、グローバル対
応 (ローカルシステム以外のタイムゾーン
を扱う) プログラムでは補助が必要
TimeZoneInfo
•.NET 3.5 から
•タイムゾーン情報を得るためのオブジェ
クト
•世界中のタイムゾーンを扱ったり、夏
時間をサポートするにはこのクラスしか
ない
TimeZoneInfo
•ConvertTimeToUtc:Local => Utc 変換
•ConvertTimeFromUtc:Utc => Local 変換
•GetUtcOffset:指定された日時における
UTC との時差を返す ※夏時間にも対
応
=> DateTimeOffset に外から与える時差
情報はこれで取れる!!
ここまでのまとめ
というわけで
•DateTime は窓から投げ捨てて
DateTimeOffset を使おう!!
•ローカルシステム以外のタイムゾーンの
時差情報は TimeZoneInfo.GetUtcOffset で
取得!!
メデタシメデタシ…
と思わせておいて
まだ未解決問題があります。
覚えてますか…?
スキップされる時間

標準時間  夏時間
切り替え問題
繰り返す時間
スキップされる時間
•.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
スキップされる時間
TimeZoneInfo クラスの Local Time を欲しがっ
ているメソッドに Invalid Time を渡すと容赦
なく死ぬ。例えば:
•ConvertTimeToUtc
•IsDaylightSavingTime
繰り返す時間
•.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
繰り返す時間
•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
スキップされる時間再び
TimeZoneInfo クラスに IsInvalidTime メソッドは
あるが、Invalid Time の範囲を調べるメソッ
ドがない (公開されてない)
作るしかない
作りますた (http://pastebin.com/GX3EYKbG)
システムが Invalid Time を自動訂正で
きる
ちょびっと

DB 設計
複数のタイムゾーンを扱うシステムで
DB に日時をどう保存するか
2 つの選択肢
A) UTC で保存
B) DateTimeOffset で保存

A 案でよさげ
DB には UTC で保存
根拠:
• プログラムでの UTC の扱いやすさ (前述)
• DB の値が Invalid/Ambiguous Time でないことが
保証される (UTC => Local 変換は失敗しな
い)
• DateTimeOffset だと、結局夏時間対応のた
め別フィールドでタイムゾーン情報を持つ
必要がある
DB には UTC で保存
しんどいところ:
• DB を検索する時も DB に保存する時も Local
=> UTC 変換が必要。となると
Invalid/Ambiguous Time 対応が必要になる
※DateTimeOffset でも必要なのは同じ
質疑応答

Más contenido relacionado

La actualidad más candente

「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Yoshifumi Kawai
 

La actualidad más candente (20)

はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
 
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
 
張量是甚麼?
張量是甚麼?張量是甚麼?
張量是甚麼?
 
Prism + ReactiveProperty入門
Prism + ReactiveProperty入門Prism + ReactiveProperty入門
Prism + ReactiveProperty入門
 
Qtではじめるクロスプラットフォームアプリケーション開発 osc2019 hamanako
Qtではじめるクロスプラットフォームアプリケーション開発 osc2019 hamanakoQtではじめるクロスプラットフォームアプリケーション開発 osc2019 hamanako
Qtではじめるクロスプラットフォームアプリケーション開発 osc2019 hamanako
 
Design Sprint と Lean UX: 顧客からの学び方
Design Sprint と Lean UX: 顧客からの学び方Design Sprint と Lean UX: 顧客からの学び方
Design Sprint と Lean UX: 顧客からの学び方
 
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
 
A quick tour of the Cysharp OSS
A quick tour of the Cysharp OSSA quick tour of the Cysharp OSS
A quick tour of the Cysharp OSS
 
磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!
 
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
 
咕唧咕唧,估計估計
咕唧咕唧,估計估計咕唧咕唧,估計估計
咕唧咕唧,估計估計
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
 
Riverpodでテストを書こう
Riverpodでテストを書こうRiverpodでテストを書こう
Riverpodでテストを書こう
 
Unityでオンラインゲーム作った話
Unityでオンラインゲーム作った話Unityでオンラインゲーム作った話
Unityでオンラインゲーム作った話
 
未来のプログラミング技術をUnityで -UniRx-
未来のプログラミング技術をUnityで -UniRx-未来のプログラミング技術をUnityで -UniRx-
未来のプログラミング技術をUnityで -UniRx-
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
 
越境アジャイル
越境アジャイル越境アジャイル
越境アジャイル
 

Destacado

Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternApplication Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Atsushi Kambara
 
ちょっとしたオレオレDSLも抽象構文木っぽくしておくと後からの拡張に対応しやすいよねっていうちょっとしたお話
ちょっとしたオレオレDSLも抽象構文木っぽくしておくと後からの拡張に対応しやすいよねっていうちょっとしたお話ちょっとしたオレオレDSLも抽象構文木っぽくしておくと後からの拡張に対応しやすいよねっていうちょっとしたお話
ちょっとしたオレオレDSLも抽象構文木っぽくしておくと後からの拡張に対応しやすいよねっていうちょっとしたお話
chocolamint
 
iOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips までiOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips まで
Yuki Tanabe
 

Destacado (13)

救急車の有料化問題について
救急車の有料化問題について救急車の有料化問題について
救急車の有料化問題について
 
Implementing Domain-Driven Design: Part 1
Implementing Domain-Driven Design: Part 1Implementing Domain-Driven Design: Part 1
Implementing Domain-Driven Design: Part 1
 
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternApplication Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD Pattern
 
Latest Status of Identity Federation
Latest Status of Identity FederationLatest Status of Identity Federation
Latest Status of Identity Federation
 
C++のtemplate特殊化的なことをC#でやった話
C++のtemplate特殊化的なことをC#でやった話C++のtemplate特殊化的なことをC#でやった話
C++のtemplate特殊化的なことをC#でやった話
 
Ms build 触ってみよう
Ms build 触ってみようMs build 触ってみよう
Ms build 触ってみよう
 
ちょっとしたオレオレDSLも抽象構文木っぽくしておくと後からの拡張に対応しやすいよねっていうちょっとしたお話
ちょっとしたオレオレDSLも抽象構文木っぽくしておくと後からの拡張に対応しやすいよねっていうちょっとしたお話ちょっとしたオレオレDSLも抽象構文木っぽくしておくと後からの拡張に対応しやすいよねっていうちょっとしたお話
ちょっとしたオレオレDSLも抽象構文木っぽくしておくと後からの拡張に対応しやすいよねっていうちょっとしたお話
 
某S社のddd(メイリオ)
某S社のddd(メイリオ)某S社のddd(メイリオ)
某S社のddd(メイリオ)
 
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
 
iOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips までiOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips まで
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
Ctfのためのpython入門
Ctfのためのpython入門Ctfのためのpython入門
Ctfのためのpython入門
 
結果を出すチームビルディング術
結果を出すチームビルディング術結果を出すチームビルディング術
結果を出すチームビルディング術
 

Último

Último (11)

論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

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