Moment: 10進ミリ秒のサポート

作成日 2016年06月22日  ·  3コメント  ·  ソース: moment/moment

(バージョン2.13.0)
ISO標準では、dateTime文字列の「Z」の前に任意の10進数の秒数を使用できます。 .netプラットフォームは小数点以下7桁を使用しているようですが、moment.jsライブラリは小数点以下3桁のみを解析しています。

作成オブジェクトから7桁全体をプルするように、フォーマッター(toISOString())にモンキーパッチを適用しましたが、これはひどいハックです。 パーサーにパッチを適用する方がはるかに優れていますが、現在の私の理解を超えています。

おそらく別の回避策がありますか?

最も参考になるコメント

マギー、

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-地盤工学および構造モニタリング

全てのコメント3件

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変更が行われない限り、日付に正しい情報を保持するために、今すぐカスタムフォーマッターを作成する必要があります。 この変更を行うことができる可能性はありますか?

このページは役に立ちましたか?
0 / 5 - 0 評価