Получить строку ISO с даты без часового пояса

Моя конфигурация - это часовой пояс в Лиссабоне. Когда я делаю new Date(), я получаю текущую локальную дату/время, которая Fri Apr 28 2017 01:10:55 GMT+0100 (GMT Daylight Time)

Когда я получу строку ISO с toISOString(), она применит часовой пояс, и я получу:

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

Есть ли способ javascript, например, toISOString() или использовать, возможно, момент, чтобы получить этот формат?

Независимо от того, какой часовой пояс или момент дня, я просто хочу, чтобы это было полночь указанной даты.

Ответ 1

Непонятно, что вы спрашиваете. Если вы хотите, чтобы дата UTC с часами всегда 0, установите часы UTC на 0 и используйте toISOString, например.

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

Ответ 2

Вы можете добиться этого, просто форматируя все, что вам нужно, используя moment.format(), а затем просто добавляя дополнительный Z к строке. Вы должны сделать это как Z в тот момент, когда JS зарезервирован для вывода.

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

Пример скрипки https://jsfiddle.net/2avxxz6q/

Ответ 3

Предположим, вы хотите получить текущую дату в ISO 8601, чтобы передать ее в свой API? Возможно, использование обертки moment.js для нативного JavaScript, упомянутого здесь может помочь?

Как в вашем примере:

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>

Ответ 4

Вам не нужна библиотека 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()
    }
  }
}

Ответ 6

Вы можете использовать метод startOf для достижения этого

moment().startOf("day").toISOString()

Ответ 7

Я считаю, вы говорите, что хотите получить текущую дату в Лиссабоне:

moment().tz("Europe/Lisbon").format('YYYY-MM-DD')

Вы можете видеть, что это работает так, как вам кажется:

moment('2017-04-28T00:00:00+01:00').tz("Europe/Lisbon").format('YYYY-MM-DD') //"2017-04-28"