momentの作成
秒からmoment
を作る時に
もしくは
ミリ秒からmoment
を作る時に
ドキュメンテーションが書いてある通り、ローカルモード
でmoment
が作られる。
つまり、コードが動いている環境のタイムゾーンで作られる。
Docker環境が日本時間ではなく、デフォルトのUTC時間になっている可能性があるので注意しないといけない。
moment.unix(1519200000)
.format(dateutils.FORMAT.MYSQL_DATETIME); // ==> "YYYY-MM-DD HH:mm:ss"
// 2018-02-21 08:00:00 になってしまうけども、日本時間だと 17:00:00 が正しい
なので、日本時間を期待している時に、utcOffset
を使わないといけない。
moment.unix(1519200000)
.utcOffset(config.timezones[config.timezone].hour) // "+09:00"
.format(dateutils.FORMAT.MYSQL_DATETIME); // "YYYY-MM-DD HH:mm:ss"
// 正しく 2018-02-21 17:00:00 になる
結論
- ミリ秒だとそのまま渡せる
- 秒だと、
* 1000
して渡すこと
date2moment(VALUE_IN_MILLISECONDS);
date2moment(VALUE_IN_SECONDS * 1000);
type DateLike = Date | number | string | null;
function date2moment(date: DateLike = null): moment.Moment {
const unixtime = _getUnixtime(date);
const hour = config.timezones[config.timezone].hour;
return moment(unixtime).utcOffset(hour);
}
function _getUnixtime(date: DateLike): number {
if (date === null) {
return Date.now();
}
if (typeof date === "number") {
return date;
}
if (date instanceof Date) {
return date.getTime();
}
if (typeof date === "string") {
return new Date(date).getTime();
}
throw new TypeError(`"${date}" must be a NULL or Number or Date`);
}