【问题标题】:How to merge two dates in JavaScript?如何在 JavaScript 中合并两个日期?
【发布时间】:2011-12-07 23:09:04
【问题描述】:

我有 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)

我怎样才能最好地做到这一点?

【问题讨论】:

  • 您需要比this更多的信息吗?

标签: javascript datetime date


【解决方案1】:
var datetime = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 
                        time.getHours(), time.getMinutes(), time.getSeconds());

【讨论】:

  • 请注意 getYear 已弃用,应切换到 getFullYear。此外,getDay 返回星期几,应切换为 getDate
  • 据我所知,这个解决方案不考虑夏令时?
【解决方案2】:

这样的事情怎么样:

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]() );
    }
    

    【讨论】:

      【解决方案4】:

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

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

      如果您需要将其作为日期对象,请将其输入new date()

      【讨论】:

        【解决方案5】:
        var msPerDay = 1000 * 60 * 60 * 24;
        var newDateTime = new Date(date.getTime() + (time.getTime() % msPerDay));
        

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

        【讨论】:

          【解决方案6】:

          我不知道这是否是最好的,但您可以尝试以下方法:

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

          有关Date 对象的进一步参考,请查看here

          【讨论】:

          • 对我不起作用 - 破坏了 TZ 并搞砸了时间
          • @Kuf 你能更具体一点,也许可以举个例子吗?你到底想完成什么?如果它与 OP 的要求有很大不同,你应该考虑开始/问你自己的问题。
          • 我将此评论留作警告。在您的代码中,您采用本地时间,然后将其转换为 UTC,然后将其再次存储为本地时间,这会使 TZ 混乱。我确实通过从每个函数名称中省略UTC 来解决它(如@pna 答案)。希望这是有道理的。
          【解决方案7】:

          这是一种使用正则表达式替换日期中的时间然后创建新的日期对象的方法。

          dateTime = new Date(date.toString().replace(/(\d\d:){2}\d{2}/,/(\d\d:){2}\d{2}/.exec(time.toString())[0]));
          

          【讨论】:

            猜你喜欢
            • 2013-05-04
            • 1970-01-01
            • 2020-03-12
            • 2020-07-28
            • 1970-01-01
            • 2021-06-10
            • 2018-08-11
            • 2015-11-02
            • 2021-06-08
            相关资源
            最近更新 更多