<p>moment()。fromNow()は「無効な日付」を返します</p>

作成日 2018年10月07日  ·  10コメント  ·  ソース: moment/moment

問題の説明と再現手順:
私は次を使用して、ユーザーのアカウントの年齢を取得するためにモーメントを使用しています。
moment(user account created date here).fromNow()が、「無効な日付」が返されます。 これは以前は機能していましたが、現在は機能していません。 作成日は次のようになります: 2018-06-07T22:54:07.310Z
moment(date here).format()は問題なく機能します。
使用するすべての変数の値を含めてください。
fromNowのフォーマットと使用に使用する日付は2018-06-07T22:54:07.310Z
環境:
不和ボット
例:OSX上のChrome 49、Windows7上のInternetExplorer 10、Ubuntu16.0.4上のNode.JS4.4.4
上記の内容にはモーメントを使用しません。
特にIOTアプリケーションのような異常な環境がある場合は、ブラウザとOSの両方が私たちにとって重要です。

役立つかもしれない他の情報: https //i.imgur.com/4LFsZh3.png

  • コードが実行されているマシンのタイムゾーン設定:PST
  • コードが実行された日時:12:20 PM、10/7/18
  • 使用中の他のライブラリ(TypeScript、Immutable.jsなど)なし

問題を報告している場合は、使用している環境で次のコードを実行し、出力を含めてください。

console.log( (new Date()).toString())
console.log((new Date()).toLocaleString())
console.log( (new Date()).getTimezoneOffset())
console.log( navigator.userAgent)
console.log(moment.version)

2018年10月7日日曜日12:29:05GMT-0700(太平洋夏時間)
2018-10-7 12:29:05
420
2.22.2
問題が瞬間的に分離されていることを確認してください。

Bug

最も参考になるコメント

返信いただきありがとうございます。 NodeJSを使用しているので、ナビゲーター環境はありません。

new Date())。toString()Thu Jan 17 2019 06:53:11 GMT-0600(中部標準時)
new Date())。toLocaleString():1/17 / 2019、6:53:11 AM
new Date())。getTimezoneOffset():360
moment.version:2.23.0
NodeJSはv11.6.0です

私はいくつかのテストを行ってきましたが、競合はObject.prototypeコンストラクターです。

Object.prototype.test = function () {
    return test
}

const moment = require('moment');

const time = moment('2017-08-08T18:29:07.000Z')
console.log(time.isValid()) // true
console.log(time.toNow()) // Invalid date
console.log(time.fromNow()) // Invalid date

全てのコメント10件

Discord Botをどのように実行しますか?

あなたは言った:_「これは以前は機能したが、もう機能しない」_
動作してから何か変更がありましたか?たとえば、discordボットが実行されている環境を更新しましたか? 「ユーザーアカウント作成日」の形式は変更されましたか?

以下の出力を表示するように不和ボットコードを変更できますか(特にハードコードされた文字列を使用):

console.log('moment.format:', moment("2018-06-07T22:54:07.310Z").format());
console.log('moment.fromNow:', moment("2018-06-07T22:54:07.310Z").fromNow());

それは前に働いていました、それからちょうど止まりました。 コードは変更されていません。 ボットによって環境が変更されることはありません。 日付の解析方法も同じように見えます。

そして、これがコンソールが出力したものです。

moment.format: 2018-06-07T15:54:07-07:00
moment.fromNow: Invalid date

これが私がそれをどのように使用したかです( this.client.momentは私が瞬間を定義した方法です):

 console.log('moment.format:', this.client.moment("2018-06-07T22:54:07.310Z").format());
console.log('moment.fromNow:', this.client.moment("2018-06-07T22:54:07.310Z").fromNow());

私がそれについて言及したかどうかはわかりませんが、私が使用している現在のバージョンは次のとおりです。
"モーメント": "^ 2.22.2"、
"moment-duration-format": "^ 2.2.2"
そして私はノードのv8.9.2を使用しています

私はAngular6(イオンベースのアプリ)で同様の問題を抱えており、モーメント2.22.2はこれと同じくらい単純なものに対して無効な日付を返します。
moment(new Date()).fromNow();
お知らせ下さい。

2.23.0でもまだ起こっています

time = moment('2017-08-08T18:29:07.000Z')
time.isValid() // true
time.toNow() // Invalid date
time.fromNow() // Invalid date

このリクエストを開いていただきありがとうございます
こんにちは! この問題を提出していただきありがとうございます! 残念ながら、これを再現することはできません。 他に何か情報を教えていただけますか?

マシンでこれらの行を実行すると役立ちます。

console.log( (new Date()).toString())
console.log((new Date()).toLocaleString())
console.log( (new Date()).getTimezoneOffset())
console.log( navigator.userAgent)
console.log(moment.version)

返信いただきありがとうございます。 NodeJSを使用しているので、ナビゲーター環境はありません。

new Date())。toString()Thu Jan 17 2019 06:53:11 GMT-0600(中部標準時)
new Date())。toLocaleString():1/17 / 2019、6:53:11 AM
new Date())。getTimezoneOffset():360
moment.version:2.23.0
NodeJSはv11.6.0です

私はいくつかのテストを行ってきましたが、競合はObject.prototypeコンストラクターです。

Object.prototype.test = function () {
    return test
}

const moment = require('moment');

const time = moment('2017-08-08T18:29:07.000Z')
console.log(time.isValid()) // true
console.log(time.toNow()) // Invalid date
console.log(time.fromNow()) // Invalid date

私もこれに影響されます。
最初は、コンストラクターで不完全なUNIXタイムスタンプ(データがどのように提供されるか)を使用することが原因であると信じていましたが、MomentJSのドキュメントのサンプルコードをテストしたところ、 fromNow()への呼び出しがあることがわかりました。 Invalid Date返しました。

ここでも同じ問題があります。

toString Tue Jan 07 2020 10:20:09 GMT+0100 (Central European Standard Time)
toLocaleString 1/7/2020, 10:20:09 AM
getTimezoneOffset -60
navigator.userAgent Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0
moment.version 2.24.0

ここ"moment": "^2.24.0",でも同じです。 ブラウザで実行すると正常に動作しますが、nodejsでは失敗します。 修正されるまでの回避策はありますか? @marwahaha

これはハックですが、 Object.prototype拡張子を変更して、列挙できないようにすることができます。

console.log(moment().fromNow()); // 'a few seconds ago'
Object.prototype.randomExtension = true;
console.log(moment().fromNow()); // 'Invalid date'

Object.keys(Object.prototype).forEach(function(extension) {
  Object.defineProperty(Object.prototype, extension, { enumerable: false });
});

console.log(moment().fromNow()); // 'a few seconds ago'
このページは役に立ちましたか?
0 / 5 - 0 評価