Создать JavaScript Объект даты из строки даты + строка времени + строка смещения часового пояса - PullRequest
0 голосов
/ 04 мая 2020

У меня всего 4 различных входа, т.е.:

  1. Строка даты (2020-05-05)
  2. Строка времени (15:30)
  3. Смещение часового пояса (-09: 00)

Я хочу объединить эти строки в один объект даты-времени, например (2020-05-05T15: 30: 00-09: 00), независимо от часового пояса моего локального браузера , Проблема в том, что когда я объединяю эти строки и пытаюсь создать объект даты с помощью новой функции Date (), моя дата и время конвертируются в UT C отметка времени.

Я пробовал это:

const date =
  moment(this.actualDateOfSurgeryDate).format(YYYYMMDD) +
  'T' +
  moment(this.actualDateOfSurgeryTimeDropDown + ' ' + this.actualDateOfSurgeryTimeAM_PMDropDown, ['h:mm A']).format('HH:mm:ss') +
  offsetTime;

this.caseDetail.actualDateOfSurgery = new Date(date);

Это дает мне вывод что-то вроде: 2020-05-05T04: 30: 00.000Z

Как я могу получить желаемый результат: 2020-05-05T15: 30: 00-09: 00 ?? У меня есть момент js, доступный в моем проекте

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Я хочу объединить эти строки в один объект datetime, например (2020-05-05T15: 30: 00-09: 00)

Объекты Date очень просты, они просто значение времени, которое является смещением в миллисекундах с 1970-01-01T00: 00: 00Z, поэтому по своей сути UT C. Встроенный синтаксический анализатор ненадежен и лишен какой-либо функциональности, такой как токены формата.

Так что, если у вас есть отдельные значения, такие как:

  • Строка даты (2020-05-05)
  • Строка времени (15:30)
  • Смещение часового пояса (-09: 00)

, затем вы можете создать строку, которая соответствует формату , определенному в ECMA-262 и который должен быть правильно проанализирован встроенным синтаксическим анализатором, например,

new Date('2020-05-05T15:30:00.000-09:00')

Однако общий совет - избегать встроенного синтаксического анализатора из-за различий в реализациях. Кроме того, формат должен быть точным (например, включая секунды и миллисекунды в метке времени, двоеточие (:) в смещении), иначе некоторые реализации отклонят его как искаженный и вернут недопустимую дату.

После получения даты Для объекта, получающего «локальную» временную метку со смещением, является проблема форматирования, на которую уже много раз отвечали (например, Как отформатировать JavaScript дату ). Не существует приличных встроенных функций форматирования ( toLocaleString с параметрами подходит для некоторых целей, но, как правило, не хватает функциональности), поэтому вам придется либо написать свою собственную функцию или используйте библиотеку.

В следующих примерах используется Luxon , который предлагается в качестве пути обновления с момента. js.

Если в Luxon указать репрезентативное местоположение, вы получите смещение для этого местоположения в дату и время даты. Кроме того, вы можете зафиксировать смещение на заданном значении, по существу установив его для часового пояса без репрезентативного местоположения, чтобы оно не имело никакого отношения к переходу на летнее или историческое время c изменения смещения:

let DateTime = luxon.DateTime;

// Offset per the specified location
let d0 = DateTime.fromISO('2020-01-01', {zone: 'America/Yakutat'});
let d1 = DateTime.fromISO('2020-06-30', {zone: 'America/Yakutat'});
console.log(d0.toString());
console.log(d1.toString());

// Fixed offset per the supplied string
let d2 = DateTime.fromISO('2020-05-05T15:30:00.000-09:00', { setZone: true});
let d3 = DateTime.fromISO('2020-01-01T15:30:00.000-09:00', { setZone: true});
console.log(d2.toString());
console.log(d3.toString());
  
<script src="https://cdn.jsdelivr.net/npm/luxon@1.24.1/build/global/luxon.min.js"></script>
1 голос
/ 04 мая 2020

Я получаю 16:30 из-за летнего времени

Дата до марта или после октября даст 15: 30

let dateString = "2020-05-05"+"T"+"15:30"+":00"+"-09:00"
console.log(dateString)
const date = new Date(dateString)
console.log(date)
const Anchorage = date.toLocaleString('en-US', {timeZone: 'America/Anchorage', hour12: false})
console.log(Anchorage)

let options = {}
options.timeZone = 'America/Anchorage';
options.timeZoneName = 'short';
console.log(date.toLocaleDateString('en-US'), date.toLocaleTimeString('en-US', options));
...