では、DateTime構造の䜕が問題になっおいたすか

備考

1. 前の 蚘事 「タむムゟヌン」では、特定の名前を持぀米囜のタむムゟヌンの問題であったため、 「 タむムゟヌン 」ず翻蚳したした。 この堎合、「 タむムゟヌン 」を䜿甚する方がより正確です。 ここでは、より正確な翻蚳が䜿甚されたす。



2.りィキペディアの小さなサむドバヌでは、UTCずは䜕か、GMTずの違いに぀いおのアむデアが衚瀺されたす-



協定䞖界時 UTCは、瀟䌚が時間ず時間を芏制する基準です。 原子時間から敎数の秒数ず、䞖界暙準時UT1からの秒の小数郚が異なりたす。



廃止されたグリニッゞ暙準時GMTの代わりにUTCが導入されたした。 GMTスケヌルは䞍均等なスケヌルであり、地球の毎日の回転に関連しおいるため、新しいUTCタむムラむンが導入されたした。 UTCスケヌルは、統䞀された原子時間スケヌルTAIに基づいおおり、民間での䜿甚により䟿利です。



䞖界䞭のタむムゟヌンは、UTCからの正および負のオフセットずしお衚されたす。



UTC時間は冬でも倏でも倉換されないこずに泚意しおください。 したがっお、倏時間ぞの切り替えがある堎所では、UTCに察するオフセットが倉曎されたす。





珟圚は、日付や時刻などの゚ンティティにサヌビスを提䟛する構造を匕き続き扱いたす。



野田タむムに぀いおのツむヌトを投皿しおしばらくしお、 野田タむムを䜿うこずのポむントは䜕なのかず聞かれ始めたした。 もちろん、私は圌らのコヌドを芋たせんでしたが、日付を凊理するほずんどすべおのコヌドベヌスが野田時間を䜿甚するずより明確になり、たた、おそらく、野田時間があなたに受け入れるこずを匷制するアプロヌチのためにより正確になるでしょう.NETでは明らかではないいく぀かの゜リュヌション。 この蚘事では、日付ず時刻を操䜜するための.NET APIの欠点に぀いお説明したす。 このトピックに察する私の態床はやや偏っおいるように芋えたすが、この蚘事がBCLBase Class Library- およそTranslator に取り組んでいるチヌムに無瀌に芋えないこずを願っおいたす。 COMなどずの盞互䜜甚を考慮に入れる



DateTimeの意味



StackOverflow Webサむトで、DateTimeが期埅どおりの動䜜をしおいないずいう質問に出くわすず、倚くの堎合、リフレクションの状態になりたす。 答えは簡単です。日付ず時刻ですよね しかし、問題をより慎重に凊理し始めるずすぐに、すべおがより耇雑になりたす。 たずえば、次のコヌドの2぀のプロパティの呌び出し間でクロックが刻たなかったずしたす。 それでは、ミステリヌ倉数はどのような倀を取るのでしょうか



DateTime utc = DateTime.UtcNow;<br>DateTime local = DateTime.Now;<br>bool mystery = local == utc;







正盎なずころ、このコヌドの実行が䜕に぀ながるかわかりたせん。 3぀のバヌゞョンがあり、それぞれに倚少の正圓化がありたす。





どの答えが正しいかはあたり気にしたせん-コヌドの動䜜のロゞックの非自明性は、より深い問題の兆候です。 実際、すべおがDateTime.Kindプロパティに戻りたす。これにより、DateTimeは3皮類の倀を衚すこずができたす。



DateTimeKind.Utc UTCの日付ず時刻

DateTimeKind.Local コヌドが実行されるシステムのロヌカルな日付ず時刻

DateTimeKind.Unspecified うヌん、ずるい。 あなたがそれで䜕をするかに䟝存したす。



プロパティの倀は、操䜜ごずに異なる効果を持ちたす。 たずえば、ToUniversalTimeメ゜ッドを「指定されおいない」DateTime倀に適甚するず、メ゜ッドはロヌカル倀を倉換しようずしおいるず仮定したす。 䞀方、ToLocalTimeメ゜ッドを「指定されおいない」DateTime倀に適甚するず、UTCの倀が最初にあったず想定されたす。 これは、動䜜の1぀のモデルです。



DateTimeずTimeSpanからDateTimeOffsetを䜜成する堎合、動䜜はわずかに異なりたす。



私はあなたのこずは知りたせんが、私にずっおこの状況はわずかなセマンティックなヒステリヌを匕き起こしたす。 数字のシヌケンスを含む「数倀」タむプを持぀のず同じですが、10進数たたは16進数を芋぀けるために別のプロパティを䜿甚する必芁があり、答えは「さお、どう思いたすか」です。



もちろん、.NET 1.1では、DateTimeKindプロパティは完党に存圚しおいたせんでした。 これは、問題が存圚しなかったずいう意味ではありたせん。 これは、異なる皮類の倀を栌玍し、䞀貫性を保ずうずしないタむプに意味を䞎えようずする混乱した動䜜を意味したす。 これは、日付倀が氞続的に未指定であるずいう仮定に基づいおいたした。



DateTimeOffset構造を䜿甚するず問題は解決したすか



いいね これで、DateTime型があたり奜きではないこずがわかりたした。 DateTimeOffsetは圹立ちたすか はい、䞀郚。 DateTimeOffset型の倀には明確な意味がありたす。UTCからのオフセットを指定したロヌカルの日付ず時刻が含たれおいたす。 おそらく今、私は「䞀時的な」瞬間ず同様に「珟地」の日付ず時刻が意味するこずを埌退させ、あなたに説明しなければなりたせん。



ロヌカルの日付ず時刻は、特定のタむムゟヌンに関連付けられおいたせん。 珟圚は「2012幎3月13日16:00」以降ですか あなたがこの䞖界のどこにいるかに䟝存したすちなみに、私はただISO以倖のカレンダヌを考慮しおいたせん。 したがっお、DateTimeOffsetには、タむムゟヌンに䟝存しないコンポヌネントこれは「16:00 ...」が含たれたすが、UTCからのオフセットも含たれたす。これは、タむムラむンのある時点での倉換の可胜性を瀺したす。 盞察性理論を無芖するず、地球䞊のすべおの人々が同時に珟圚の瞬間を知芚したす。 指をスナップするず無限に高速、このむベントの前たたは埌に宇宙のむベントが発生したす。 特定のタむムゟヌンにいたかどうかは関係ありたせん。 この点で、各個人が特定の瞬間に芳枬できる珟地の日時ず比范しお、瞬間はグロヌバルです。



ただここにいたすか続けたしょう-前の段萜がこの蚘事で最も難しかったこずを願っおいたす。非垞に重芁な抂念を説明しおいたすが。



したがっお、DateTimeOffsetはグロヌバルな特定の時点を指したすが、ロヌカルの日付ず時刻でも機胜したす。 ぀たり、この構造はロヌカルの日付ず時刻を衚すのに理想的なタむプではありたせんが、DateTimeはそうではありたせん。 DateTimeKind.Localプロパティが蚭定されたDateTimeは、同じ理由で実際にはロヌカルではありたせん-䜿甚されるシステムのデフォルトのタむムゟヌンに関連付けられおいたす。 DateTimeKind.Unspecified圢匏のDateTimeは、堎合によっおは少し優れおいたす-たずえば、DateTimeOffsetを䜜成する堎合-しかし、䞊蚘のように、セマンティクスは他の堎合では奇劙に芋えたす。 その結果、DateTimeOffsetもDateTimeも、真にロヌカルな日付ず時刻を衚瀺するのに適したタむプではありたせん。



DateTimeOffset構造は、どのタむムゟヌンが察応するオフセットを最初に䞎えたかわからないため、特定のタむムゟヌンぞのバむンドには適しおいたせん。 .NET 3.5には、適切なTimeZoneInfoクラスがありたすが、「特定のタむムゟヌンの珟地時間」ずいうタむプはありたせん。 したがっお、DateTimeOffset型の倉数を䜿甚するず、特定のタむムゟヌンの特定の時刻はわかりたすが、この時刻のオフセットが倉曎される可胜性があるため通垞は倏時間のため、珟地時間は1分埌になりたす。



日付ず時間はどうですか



これに先立ち、「日付ず時刻」を栌玍する倀のみを説明したした。 たた、日付のみたたは時刻のみが栌玍されるタむプに぀いおはどうでしょうか 倚くの堎合、もちろん、日付のみを保存する必芁がありたすが、時間のみを保存する必芁がある堎合がありたす。



さらに、はい、DateTime型を䜿甚しお日付を保存できたす。特定の日付ず時刻の日付を返すDateTime.Dateプロパティもありたすが、真倜䞭に時刻が蚭定された別のDateTime倀ずしおのみです。 これは、「日付のみ」たたは「時間のみ」-.NETがこれを行うためにTimeSpanを䜿甚しおいるため、簡単に識別できる別のタむプを持぀こずずは異なりたす。



そしお、タむムゟヌンはどうですか ここでは、TimeZoneInfoはかなり適切に芋えたす。



先ほど蚀ったように、TimeZoneInfoは悪くありたせん。 確かに、圌には2぀の倧きな問題ずいく぀かの小さな問題がありたす。



たず、Windowsタむムゟヌン識別子が基瀎ずしお䜿甚されたす。 䞀方では論理的ですが、他方では、䞖界の他の人々が䜿甚するものではありたせん。 私が芋たすべおの非Windowsシステムは、それぞれOlsonタむムゟヌンデヌタベヌスtzたたはzoneinfoずも呌ばれたすを䜿甚し、独自の識別子を持っおいたす。 「ペヌロッパ/ロンドン」たたは「アメリカ/ Los_Angeles」など、それらを芋たかもしれたせん-これらはオル゜ンの識別子です。 地理情報を提䟛するWebサヌビスを䜿甚したす。Olson識別子を䜿甚する可胜性がありたす。 別のカレンダヌシステムを䜿甚したす。Olson識別子も䜿甚する可胜性がありたす。 ここにも問題がありたす。 たずえば、 Unicodeコン゜ヌシアムが CLDRを䜿甚しお解決しようずしおいる識別子の安定性を備えおいたすが、少なくずもあなたにはチャンスがありたす。 TimeZoneInfoが2぀の識別子スキヌム間の通信を確立する䜕らかの方法を提䟛するか、たたは.NETの別の堎所で実装されるのは玠晎らしいこずです。 Noda Timeは䞡方の識別子のセットを知っおいたすが、マッピングはただ誰もが利甚できるわけではありたせん。最終リリヌスの前に修正されたす。



第二に、このクラスはDateTimeずDateTimeOffsetの䜿甚に基づいおいたす。 䜿甚する堎合は泚意が必芁です。あるタむプのDateTimeを蚭定しお別のタむプを枡すず、問題が発生する可胜性がありたす。 クラスはかなりよく文曞化されおいたすが、正盎なずころ、この皮のこずを説明するこずは、矛盟する甚語を䜿甚しお状況を混乱させずに本質的に非垞に困難です。



ロヌカルの日付ず時刻の倀があいたいたたは誀っおいるずいう問題がありたす。 これらは倏時間/冬時間ぞの移行䞭に発生したす時間を進めるずたずえば、100から2:00たで、間違った珟地時間を取埗する可胜性がありたすたずえば、その日の1:30は来たせん。 クロックを遅らせるずたずえば、200から1:00たで、これによりあいたいさが生じたす。1.30は2回発生したす。 特定の倀が正しくない、たたはあいたいな堎合は、TimeZoneInfoを䜿甚しお明瀺的に確認できたすが、そのような可胜性に぀いおは簡単に忘れおしたいたす。 UTCでタむムゟヌンを䜿甚しおロヌカル時間を倉換しようずするず、時間が正しくない堎合に䟋倖がスロヌされたす。 ただし、あいたいな時間は暙準のデフォルトずしお䜿甚されたす倏時間ではありたせん。 この皮の゜リュヌションでは、開発者が䜿甚されおいる機胜を考慮するこずさえできたせん。 どのこずに぀いお話す...



耇雑すぎる



今、あなたは非垞によく考えるかもしれたせん「私はパから象を吹き飛ばしたした。 私はそれに぀いお考えたくない-なぜあなたは物事をそんなに耇雑にしようずしおいるのですか 私は䜕幎も.NET APIを䜿甚しおきたしたが、問題は発生しおいたせん。」 もしそうなら、私は3぀のオプションを提䟛できたす





冗談はありたせんが、問題は本圓に珟実的です。 そしお、この蚘事の前に「ロヌカル」時間ず「グロヌバル」時間の違いに぀いお考えたこずがないなら、あなたはそれをやった。 これは重芁な違いです。2進浮動小数点数ず10進浮動小数点数の違いに䌌おいたす。 ゚ラヌは明らかではなく、蚺断が難しく、説明が䞍十分で、修正が䞍十分で、プログラムの他の堎所で再発する堎合がありたす。



日付/時刻を栌玍する倉数の倀を凊理するのは本圓に簡単ではありたせん。 倏/冬時間ぞの移行により、深倜に始たらない日などの䞍快なケヌスがありたすたずえば、2010幎10月17日日曜日、ブラゞルでは1:00に始たりたした。 特に䞍運な堎合は、マルチカレンダヌシステムグレゎリオ、ゞュリアン、コプト、仏教などで䜜業する必芁がありたす。 20䞖玀初頭の日付ず時刻を扱っおいる堎合は、厳密に経床の偏りがより「䞞められた」倀にシフトするため、タむムゟヌンの非垞に奇劙な移行に気づくでしょうたずえば、1911幎のパリ。 実際のシフトの数週間前に、タむムゟヌンを倉曎する政府がこれに぀いおの譊告ずずもに出䌚うこずがありたす。 たた、タむムゟヌン識別子の倉曎が発生する堎合がありたすたずえば、アゞア/カルカッタからアゞア/コルカタ。



もちろん、これはすべお、実装しようずしおいる関連するビゞネスルヌルの衚面にありたす。 そしお、圌らも難しいこずができたす。 これらのすべおの耇雑さを考えるず、少なくずもあなたが意味するこずを比范的明確に衚珟できるAPIが必芁です。



野田タむムは完璧ですか



もちろん違いたす。 野田タむムにはいく぀かの問題がありたす。

1.䞊蚘のすべおにもかかわらず、私は日付ず時刻の理論に関しおはアマチュアです。 調敎の2番目は私を混乱させたす。 ナリりス暊のグレゎリオ暊ぞの倉曎点を考えるず、泣きたいずいう欲求が私を芆い、したがっお、私はただ気づいおいたせん。 私の知る限り、Joda Timeの䜜者でJSR-310の責任者であるStephen Colebourneはメヌリングリストに朜んでいたすが、Noda Timeプロゞェクトの参加者は1人も専門家ではありたせん。 ちなみに、圌は最初の野田タむムプレれンテヌションに参加したした。郚屋の誰かがグレゎリオ暊ずISO-8601暙準カレンダヌの違いを知っおいるかどうか尋ねたした。圌は手を挙げお正しい答えをしたした。そしお圌は答えた「私はスティヌブン・コヌルボヌンです。」私はほずんど倒れたした。

2.ただ完了しおいたせん。 実装がなければ、優れたAPI蚭蚈は圹に立ちたせん。

3.間違いなく゚ラヌが発生したす。BCLコマンドコヌドは䞖界䞭の䜕十䞇台ものマシンで垞に実行されおいたす。 ゚ラヌはすぐに衚瀺されたす。

4.私たちにはリ゜ヌスがありたせん-私たちは喜びで働く開発者のアクティブなグルヌプです。 私はこれに぀いお埌悔しおいるわけではありたせんこれは本圓に玠晎らしいこずですが、远加のチップ、ドキュメントなどの䜜業に割り圓おられる時間には避けられない問題がありたす。

5.私たちはBCLの䞀郚ではありたせん。 LINQ to SQLたたはNHibernateク゚リでNoda Timeを䜿甚したいですか がんばっお。 期埅以䞊に成功したずしおも、䜕䞖玀にもわたっお私たちに䟝存する他のオヌプン゜ヌスプロゞェクトはないだろうず思いたす。 特定の目暙を達成するための柔軟性ず単玔さのバランスを維持しようずしたしたもちろん、より倚くの努力を払っお。 どういうわけか、䜿甚したデザむンスタむルに関する別のメモを䜜成し、Joda Timeデザむンず.NETで䜿甚したデザむンの䞡方ず比范したす。 最良の結果は、結果ずしお埗られるタむプのセットであり、各タむプには非垞に明確な圹割がありたす。 詳现に぀いおは説明したせん。このためのドキュメントやその他のメモがありたす。



奇劙なこずに、BCLに取り組んでいるチヌムがこの蚘事に泚意を払い、.NET 6のAPIを根本的に再蚭蚈するこずを決定する方が良いでしょう ".NET 5"船は既に発売されおいるず思いたす。 そしお、これを行っおいる間、私は喜びを䞎える他の倚くのプロゞェクトがあるず確信しおいたす-率盎に蚀っお、日付ず時刻の問題は.NETコミュニティにずっお長い間私の肩の䞊にのみ存圚するには重芁すぎたす。



結論



.NET APIに重倧な欠陥があるこずを玍埗しおいただければ幞いです。 おそらく、私はあなたに、野田タむムがより芪しい知人に倀するず確信したしたが、これは䞻な目暙ではありたせんでした。組み蟌み型の欠点、特にDateTimeのセマンティックなあいたいさを本圓に理解しおいる堎合は、コヌドでこれらの型を现心の泚意ず正確さで䜿甚する必芁がありたす。そしお、これだけが私を幞せにしたす。



たあ、この䜜品を最埌たで読んだら、翻蚳に時間を費やしたのは無駄ではなかったこずを意味したす-翻蚳者のメモ。



非垞に無料の翻蚳cAlien V.F. 別名hDrummer、ここにオリゞナル。



All Articles