# 08ex5. DateTime ________________________________________ .NET CoreでWindowsとLinuxでタイムゾーンを識別するID表記が異なるという話 https://tech.tanaka733.net/entry/2020/02/timezone-id ________________________________________ ## 1. 主なタイムゾーン ________________________________________ |WindowsでのID |.NETでのDisplayName |------------------------------|--------------------------- |Tokyo Standard Time |(UTC+09:00) 大阪、札幌、東京 |Korea Standard Time |(UTC+09:00) ソウル |China Standard Time |(UTC+08:00) 北京、重慶、香港特別行政区、ウルムチ |Central European Standard Time|(UTC+01:00) サラエボ、スコピエ、ワルシャワ、ザグレブ |GMT Standard Time |(UTC+00:00) ダブリン、エジンバラ、リスボン、ロンドン |Atlantic Standard Time |(UTC-04:00) 大西洋標準時 (カナダ) |Eastern Standard Time |(UTC-05:00) 東部標準時 (米国およびカナダ) |Central Standard Time |(UTC-06:00) 中部標準時 (米国およびカナダ) |Mountain Standard Time |(UTC-07:00) 山地標準時 (米国およびカナダ) |Pacific Standard Time |(UTC-08:00) 太平洋標準時 (米国およびカナダ) - ________________________________________ ## 2. 典型的なアプローチ ________________________________________ ### 2.1. 単一基準(サーバ時刻)にする - UTCまたは開発会社のLocalTimeを基準にし、(通常は単一存在であるアクティブな)DBが発行する日付時刻のみを使用し時系列の正解とする - 言語上の標準ライブラリの現在時刻などを使ってはならない ________________________________________ ### 2.2. ユーザーが入力する時刻(ユーザ時刻)の考慮事項 基本事項 - ユーザが入力した日付時刻は、現在ではなくその日付時刻のタイムゾーンを使用してサーバ時刻に変換する(サマータイムの考慮) - 既に保存済みの日付時刻に対して、ルール自体が変更された場合どうするか決めておく(国のタイムゾーン変更、サマータイムの廃止、採用など) - 世界的見れば、この2010年~2020年の10年間に100回以上どこかの国で変更が行われている - 面倒ならば、「対応しない」でもよい Javascriptの注意点 Date https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date Date() コンストラクター https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/Date Date.prototype.toJSON() https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON 1. デフォルトのTimezoneを設定したり、指定して文字列を得る手段が標準ライブラリにはない(常にPCのTimezoneに依存する) 2. 日付だけの場合と、ISO8601形式を渡した場合の挙動が分かりづらい 3. javascript上のtimestampの保証値は、+-8640000000000000(Number.MAX_SAFE_INTEGERより少し少ない) 4. JSON.stringify()はtoJSON()を呼び出す。通常はtoISOString()を返す ```js // 日付までだとUTC // Sat Apr 01 2023 09:00:00 GMT+0900 (日本標準時) console.log(new Date('2023-04-01')); // 時刻まで渡すとローカル扱い。ミリ秒も渡せる // Sat Apr 01 2023 09:00:00 GMT+0900 (日本標準時) // 123 let d1 = new Date('2023-04-01T00:00:00.123'); console.log(d1); console.log(d1.getMilliseconds()); // 時刻まで時差付きで渡せばその通り。ミリ秒も渡せる // Sat Apr 01 2023 09:00:00 GMT+0900 (日本標準時) // 123 let d2 = new Date('2023-04-01T00:00:00.123z'); console.log(d2); console.log(d2.getMilliseconds()); // Sat Apr 01 2023 13:00:00 GMT+0900 (日本標準時) console.log(new Date('2023-04-01T00:00:00-04:00')); // Tue Apr 20 -271821 09:18:59 GMT+0918 (日本標準時) console.log(new Date(-100000000*1000*60*60*24)); // Sat Sep 13 275760 09:00:00 GMT+0900 (日本標準時) console.log(new Date(100000000*1000*60*60*24)); // '"2023-04-01T04:00:00.000Z"' console.log(JSON.stringify(new Date('2023-04-01T00:00:00-04:00'))); ``` ________________________________________ ## 3. 日付のTips - 月末を取得したかったら、標準ライブラリで次の月の月初-1dayする