Объединение двух объектов даты с поддержкой часового пояса в javascript - один для даты, другой для времени - PullRequest
0 голосов
/ 03 июля 2019

Допустим, у меня есть следующие объекты, поддерживающие часовой пояс Date объекты в Javascript:

var date1 = new Date("2019-07-02T07:30:00-05:00");
var date2 = new Date("2020-08-05T00:00:00-05:00");

Каков наилучший способ объединить эти два, чтобы я сохранил время от date1 и дату от date2, получив:

new Date("2020-08-05T07:30:00-05:00");

Я пробовал:

date1.setDate(date2.getDate());
date1.setMonth(date2.getMonth());
date1.setYear(date2.getYear());

, который правильно установил день и месяц для date1, но год неправильно установлен на "120" с примерами ввода выше.

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Несколько вещей:

  • Date объекты не могут быть осведомлены о часовом поясе. Когда передается строка со смещением часового пояса, как показано здесь, они используют это смещение для определения эквивалентного времени UTC. В конечном счете, единственное, что хранится в объекте Date, это числовая метка времени Unix, которая соответствует времени UTC. Вы можете увидеть это с помощью .getTime() или .valueOf().

  • getDay / setDay для дня недели, с субботы (0) по воскресенье (6). Используйте getDate / setDate для дня месяца.

  • getYear / setYear предназначены для двухзначных лет (точнее, текущего года минус 1900) и не должны использоваться никогда. Вместо этого используйте getFullYear / SetFullYear.

Из-за первого пункта то, что вы спрашиваете, невозможно. Или, по крайней мере, невозможно с полным диапазоном значений, которые могут встречаться в таких строках. Вместо этого вы можете напрямую управлять строками или использовать такие библиотеки, как Luxon или Moment .

Я бы тоже подумал немного о том, чего вы на самом деле пытаетесь достичь. Откуда эти два значения? Почему части данных важны, а другие отбрасываются? Что вы будете делать, если смещения между двумя значениями различаются? Только вы можете ответить на эти вопросы.

0 голосов
/ 03 июля 2019

Манипулируйте строками ISO напрямую:

const date1 = new Date("2019-07-02T07:30:00-05:00");
const date2 = new Date("2020-08-05T00:00:00-05:00");

const date3 = new Date([
  date2.toISOString().split('T')[0],
  'T',
  date1.toISOString().split('T')[1],
].join(''));

console.log({date1, date2, date3});

Между прочим, нет объектов даты, учитывающих часовой пояс.Как только Date(...) сработает, время будет UTC.getTimezoneOffset получает разницу от местного часового пояса до UTC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...