web-dev-qa-db-ja.com

タイムゾーンなしの日付からISO文字列を取得します

私の設定はリスボンのタイムゾーンです。 new Date()を実行すると、現在のローカルの日付/時刻であるFri Apr 28 2017 01:10:55 GMT+0100 (GMT Daylight Time)を取得します

toISOString()でISO文字列を取得すると、タイムゾーンが適用され、次のようになります。

_2017-04-28T00:10:55.964Z
_

問題は、数分前の日付時刻が(昨日)のようだったことです。

_2017-04-27T23:45:05.654Z
_

私はmoment.js(これは初めて)を試しましたが、このようなことをしました

_document.write(moment('2017-04-28').format())
_

しかし、これは_2017-04-28T00:00:00+01:00_ではない_2017-04-28T00:00:00.000Z_を取得します

この値をRestfulメソッドのパラメーターとして渡し、DateTime型として自動的に解析したいのですが、moment.js形式から出力を渡すと、_2017-04-27 23:00:00.00_として解析されます

new Date()またはnew Date('2017-04-27')(日付部分)を使用して新しい日付を作成する場合、タイムゾーンのない時間なしで次のようなISO形式を取得したいだけです。

_2017-04-28T00:00:00.000Z
_

ToISOString()のようなjavascriptメソッドがありますか、それともその瞬間を使ってそのフォーマットを取得しますか?

タイムゾーンや時刻に関係なく、与えられた日付の真夜中をシミュレートするだけです。

12
Maximus Decimus

あなたが何を求めているのかは非常に不明確です。時間を常に0とするUTC日付が必要な場合は、UTC時間を0に設定し、toISOStringを使用します。

var d = new Date();
d.setUTCHours(0,0,0,0);
console.log(d.toISOString());

もちろん、これはUTC日付を表示します。これは、日付を生成したシステムの日付と異なる場合があります。

また、

new Date('2017-04-27').toISOString();

should return 2017-04-27T00:00:00Z(つまり、ローカルとして扱うISO 8601に反するECMA-262に従ってUTCとして解析する必要があります)使用中のすべての実装で信頼性があります。

ISO 8601形式で現在の日付を取得するだけの場合は、次のことができます。

if (!Date.prototype.toISODate) {
  Date.prototype.toISODate = function() {
    return this.getFullYear() + '-' +
           ('0'+ (this.getMonth()+1)).slice(-2) + '-' +
           ('0'+ this.getDate()).slice(-2);
  }
}

console.log(new Date().toISODate());

ただし、組み込みのtoISOStringはUTCを使用するため、混乱する可能性があります。 UTC日付が必要な場合:

if (!Date.prototype.toUTCDate) {
  Date.prototype.toUTCDate = function() {
    return this.getUTCFullYear() + '-' +
           ('0'+ (this.getUTCMonth()+1)).slice(-2) + '-' +
           ('0'+ this.getUTCDate()).slice(-2);
  }
}

console.log(new Date().toUTCDate());
9
RobG

moment.format()を使用して必要なものをすべてフォーマットし、追加のZを文字列に追加するだけで、これを実現できます。 JSが出力用に予約されている瞬間に、Zとしてこれを行う必要があります。

var date = moment('2014-08-28').format("YYYY-MM-DDT00:00:00.000") + "Z";

フィドルの例 https://jsfiddle.net/2avxxz6q/

5
li x

https://momentjs.com/docs/#/displaying/as-iso-string /を使用できます

moment().toISOString(keepOffset);

moment.jsライブラリは不要です。日付コンポーネントを解析して接続するだけです。例えば

type Components = {
  day: number,
  month: number,
  year: number
}

export default class DateFormatter {
  // 2018-11-11T00:00:00
  static ISOStringWithoutTimeZone = (date: Date): string => {
    const components = DateFormatter.format(DateFormatter.components(date))
    return `${components.year}-${components.month}-${components.day}T00:00:00`
  }

  static format = (components: Components) => {
    return {
      day: `${components.day}`.padStart(2, '0'),
      month: `${components.month}`.padStart(2, '0'),
      year: components.year
    }
  }

  static components = (date: Date): Components => {
    return {
      day: date.getDate(),
      month: date.getMonth() + 1,
      year: date.getFullYear()
    }
  }
}
0
onmyway133

ISO 8601で現在の日付を取得してAPIに渡すことを希望すると思いますか?上記のネイティブJavaScriptにmoment.jsラッパーを使用することもできます here

あなたの例のように:

document.write(moment('01/12/2016', 'DD/MM/YYYY', true).toISOString());

スニペット:

$(function(){
  var displaysTime = $('#divTime');
  displaysTime.text(moment.utc('27/04/2017', 'DD/MM/YYYY', true).toISOString());
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>

<div id="divTime">
</div>
0
Smit