如何在JavaScript中合并两个日期?

26

我有2个日期对象。我想从一个日期对象中获取日期,从另一个日期对象中获取时间,并将它们组合成一个新的日期对象。

date.toString() = Wed Dec 21 2011 00:00:00 GMT+0000 (GMT)
time.toString() = Sun Dec 31 2000 03:00:00 GMT+0000 (GMT)

# I want to end up with
datetime.toString() = Wed Dec 21 2011 03:00:00 GMT+0000 (GMT)

我该如何最好地完成这个任务?


2
你需要比这个链接提供的信息更多吗? - Jon
7个回答

50
var datetime = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 
                        time.getHours(), time.getMinutes(), time.getSeconds());

10
请注意,“getYear”已被弃用,应切换到“getFullYear”。此外,“getDay”返回一周中的星期几,应该切换到“getDate”。 - Brett Pontarelli
据我所知,这个解决方案没有考虑夏令时? - chmanie

5
这样怎么样呢:
var year  = date.getFullYear(),
    month = date.getMonth(),
    day   = date.getDate();

time.setFullYear(year);
time.setMonth(month);
time.setDate(day);

3
var parts = ['Hours', 'Minutes', 'Seconds', 'Milliseconds'];
for (var i=0, p; p=parts[i], i<parts.length; i++) {
  date['setUTC'+p]( time['getUTC'+p]() );
}

2

您可以使用字符串函数来构建目标字符串...

datetime = date.toString().substr(0,16) + time.toString().substr(16,40)

如果您需要将其作为日期对象使用,则将其输入到new date()中。


1
var msPerDay = 1000 * 60 * 60 * 24;
var newDateTime = new Date(date.getTime() + (time.getTime() % msPerDay));

编辑:我的假设日期变量是没有时间的日期。


1

我不确定这是否是最好的方法,但你可以尝试以下操作:

datetime = new Date(
  date.getUTCFullYear(),
  date.getUTCMonth(),
  date.getUTCDate(),
  time.getUTCHours(),
  time.getUTCMinutes(),
  time.getUTCSeconds()
);

如需进一步了解 Date 对象,请参考这里


对我来说没有作用-打破了TZ并搞乱了时间。 - Kuf
@Kuf,你能具体一点并且给个例子吗?你到底想要实现什么?如果与原帖的问题非常不同,你应该考虑发起或提出自己的问题。 - Brett Pontarelli
我留下这条评论作为警告。在你的代码中,你获取本地时间,然后将其转换为UTC,并再次存储为本地时间,从而破坏了时区信息。我通过省略每个函数名称中的“UTC”来解决了这个问题(如@pna的答案)。希望这样说得清楚些。 - Kuf

1
这是一种使用正则表达式替换日期中的时间并创建新的Date对象的方法。
dateTime = new Date(date.toString().replace(/(\d\d:){2}\d{2}/,/(\d\d:){2}\d{2}/.exec(time.toString())[0]));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接