在javascript中合并两个时区感知日期对象-一个用于日期,另一个用于时间

时间:2019-07-03 18:07:45

标签: javascript datetime merge

可以说我在Javascript中具有以下时区感知Date对象:

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 个答案:

答案 0 :(得分:1)

几件事:

  • function myFunction() { var position = $(this).scrollTop() var class_pos = $('.white, .black').filter(function(){ return position >= $(this).position().top}) // console.log(class_pos) if ($(class_pos[class_pos.length - 1]).hasClass('white')){ logoSwap(0); } else { logoSwap(1); } } 对象不能识别时区。当传递带有时区偏移量的字符串(如您在此处显示的字符串)时,它们将使用该偏移量确定等效的UTC时间。最终,Date对象中存储的唯一内容是与该UTC时间相对应的数字Unix时间戳。您可以通过Date.getTime()看到它。

  • .valueOf() / getDay用于一周中的某天,星期六(0)到星期日(6)。在每月的一天中使用setDay / getDate

  • setDate / getYear用于两位数的年份(或者说是当前年份减去1900),因此永远不要使用。改用setYear / getFullYear

由于第一点,您无法提出要求。或至少无法在此类字符串中遇到的所有值范围。相反,您可以直接操作字符串,也可以使用LuxonMoment之类的库。

对于您实际上想要实现的目标,我也会想一想。这两个值从何而来?为什么部分数据很重要而其他部分却被丢弃?如果两个值之间的偏移量不同,该怎么办?只有你能回答这些问题。

答案 1 :(得分:0)

直接处理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的时差。