秋津洲の目では受諾中の任務の表示や進捗のカウントをしていますが、「日本時間の0時」や「日本時間の5時」など、「タイムゾーンを考慮した日時」の備忘録です。
艦これでは1日の区切りが日本時間の午前5時となっています。
任務ではデイリー、マンスリー、ウィークリー、クォータリーなどありますが、どれも開始・終了(時間切れは)この午前5時を基準に更新されています。
開始された任務しか受諾できないため、開発時に開始時刻は気にする必要はないですが、終了時刻についてはチェックする必要があります。(終了した任務を処理対象から除外・データ削除を行うため。)
通常、クライアント側で時刻を取得する場合はJavascriptで
let today = new Date();
let hour = today.getHours();
として現在時を取得して0時なり5時なりと比較すればいいのですが、当然この時刻はクライアント側の時刻なので、日本時間かどうかわかりません。
まあ日本のゲームなのでプレーヤーもほぼ100%日本時間なのでしょうが、海外版のWikiやドロップ情報サイトなどもあるので、日本のタイムゾーンで時刻を取得します。
let nowMilliSec = Date.now();
let timezoneOffsetJp = 1000 * 60 * 60 * 9;
let utcJp = new Date(nowMilliSec + timezoneOffsetJp);
let jpHour = utcJp.getUTCHours();
とすることでjpHourに現在の日本時間の「時」を取得しています。
まず1行目でnowMilliSecに基準時(1970/1/1 00:00:00)からの経過ミリ秒をUTC(協定世界時)で取得します。
2行目でtimezoneOffsetJpにUTCと日本のタイムゾーンの差を計算します。
(1000ミリ秒 x 60秒 x 60分 x 9時間) = 32,400,000ミリ秒
「9時間」の部分を別の値にすると、他のタイムゾーンの時刻を取得することが出来ます。
3行目でnowMilliSecとtimezoneOffsetJpを足した値でDateを作成します。
これは現在のUTCの時刻に日本のタイムゾーンを加えた9時間後の協定世界時になります。
4行目で9時間後のUTCから「時」を取得します。
一言で言えば、日本のタイムゾーンに合わせたUTCを作成して、そこから時刻を取得しています。
toLocaleDateString()で一発で取得出来るのかも知れませんが、使ったことがない&書式が実装依存とのことなので今回は計算して取得しています。