(バージョン2.13.0)
ISO標準では、dateTime文字列の「Z」の前に任意の10進数の秒数を使用できます。 .netプラットフォームは小数点以下7桁を使用しているようですが、moment.jsライブラリは小数点以下3桁のみを解析しています。
作成オブジェクトから7桁全体をプルするように、フォーマッター(toISOString())にモンキーパッチを適用しましたが、これはひどいハックです。 パーサーにパッチを適用する方がはるかに優れていますが、現在の私の理解を超えています。
おそらく別の回避策がありますか?
Moment.jsはJavaScriptのDateオブジェクトのラッパーであるため、小数点以下3桁(ミリ秒)に制限されています。 これは、dateオブジェクトがサポートするのはそれだけであるため、これ以上格納する方法は本当にありません。 ただし、表示または解析する小数点以下7桁を取得するために、モンキーパッチを適用する必要はありません。 最初の3つだけが実際に使用されることに注意してください。
moment('2016-01-01T05:21:22.1234567Z').format('YYYY-MM-DDTHH:mm:ss.SSSSSSS')
"2015-12-31T23:21:22.1230000"
出力はゼロで埋められますが、双方向に7桁あることに注意してください。
マギー、
Ah. I hadn't realised this was a limitation of Javascript.
I had found the option for formatting that you had mentioned - but
私にとって、私は本当にそれらの余分な指が必要です。 ゼロは十分ではありません。
My 'monkey patch' looks at the creationData for the moment and
入力文字列からのミリ秒を手動で解析します(
利用可能)。
//Monkey patch the moment library to use 7 decimal places for seconds in it's standard ISO format - to match C#
moment.fn._oldToISOString = moment.fn.toISOString;
moment.fn.toISOString = function () {
try {
var originalDateSplit = moment(this).creationData().input.split(".");
var milliseconds = originalDateSplit[originalDateSplit.length - 1];
if (milliseconds.indexOf(this.milliseconds()) === 0) {
return moment(this).format('YYYY-MM-DD[T]HH:mm:ss.') + milliseconds + "Z";
} else {
return moment(this)._oldToISOString();
}
} catch (error) {
return moment(this)._oldToISOString();
}
}
それはきれいではありません-そして、あった瞬間にのみ機能します
元々はISO日付文字列から解析されました。 また、一貫性がなくなります
ミリ秒()関数を使用します。 より良いアイデアは、傍受することです
プロセスを解析し、小数点以下の秒数を上の別のプロパティにプルします
モーメントオブジェクト-必要に応じてそれを返すことができます。
However - I do appreciate that we are moving beyond the scope of the
この時点でmoment.jsライブラリ-それはもはやラッパーではありません
JavascriptDateオブジェクト。
Perhaps we could make this limitation a little clear in the moment.js
ドキュメンテーション? 現在、ミリ秒の切り捨ては、
サンプルコードですが、明示的に説明されていません-そして説明はありません
なぜそれがこのように振る舞うのか。
Thank you for your help Maggie - it is much appreciated.
よろしく、
ベンハサウェイ
ソフトウェア開発者
DATUM-地盤工学および構造モニタリング
こんにちは@maggiepint 、
私は同じものを探しています。 moment.js
を介してデバッグした後、 zerofill
関数を呼び出すことに気付きました。
結果の値は文字列であるため、ゼロで埋められる理由がわかりません🤔🤔🤔
たとえば、私はこれを持っています:
const value = 1596099230963;
const formatString = 'MM/DD/YYYY HH:mm:ss.SSSSSS';
const val = moment.utc(value).format(formatString);
console.log(val);
07/30/2020 08:53:50.963000
代わりに07/30/2020 08:53:50.963939
さらに、古いバージョンのmoment.js
は、このゼロフィルを実行しなかったことに気付きました。たとえば、バージョン2.5です。
moment.js
変更が行われない限り、日付に正しい情報を保持するために、今すぐカスタムフォーマッターを作成する必要があります。 この変更を行うことができる可能性はありますか?
最も参考になるコメント
マギー、
私にとって、私は本当にそれらの余分な指が必要です。 ゼロは十分ではありません。
入力文字列からのミリ秒を手動で解析します(
利用可能)。
//Monkey patch the moment library to use 7 decimal places for seconds in it's standard ISO format - to match C# moment.fn._oldToISOString = moment.fn.toISOString; moment.fn.toISOString = function () { try { var originalDateSplit = moment(this).creationData().input.split("."); var milliseconds = originalDateSplit[originalDateSplit.length - 1]; if (milliseconds.indexOf(this.milliseconds()) === 0) { return moment(this).format('YYYY-MM-DD[T]HH:mm:ss.') + milliseconds + "Z"; } else { return moment(this)._oldToISOString(); } } catch (error) { return moment(this)._oldToISOString(); } }
それはきれいではありません-そして、あった瞬間にのみ機能します
元々はISO日付文字列から解析されました。 また、一貫性がなくなります
ミリ秒()関数を使用します。 より良いアイデアは、傍受することです
プロセスを解析し、小数点以下の秒数を上の別のプロパティにプルします
モーメントオブジェクト-必要に応じてそれを返すことができます。
この時点でmoment.jsライブラリ-それはもはやラッパーではありません
JavascriptDateオブジェクト。
ドキュメンテーション? 現在、ミリ秒の切り捨ては、
サンプルコードですが、明示的に説明されていません-そして説明はありません
なぜそれがこのように振る舞うのか。
よろしく、
ベンハサウェイ
ソフトウェア開発者
DATUM-地盤工学および構造モニタリング