在 javascript 中的两个不同时间获取相同的 unix 时间戳

Getting same unix time stamp for two different times in javascript

我有两个 ical 格式的时间戳,我想先将它们转换为正常时间,然后再转换为 unix 时间。

这是我用来将正常时间转换为 unix 时间戳的函数:

var normal_to_unix = function (date_string) {
    var date = new Date(date_string);
    return date.getTime() / 1000;
}

这个函数很好,因为日期已经是 UTC,我不需要做任何转换。

现在这是我用来将 ical 时间转换为 unix 时间的函数。在我的例子中,实际时间就像 "20180603T150000Z".

var ics_to_unix = function (ics_string) {
    var year = ics_string.slice(0, 4);
    var month = ics_string.slice(4, 6);
    var date = ics_string.slice(6, 8);
    var hours = ics_string.slice(9, 11);
    var minutes = ics_string.slice(11, 13);
    var seconds = ics_string.slice(13, 15);
    var milliseconds = 0;
    console.log(year, month, date, hours, minutes, seconds, milliseconds); // This is example output 2018 06 03 15 00 00 0 
    return normal_to_unix((new Date(year, month, date, hours, minutes, seconds, milliseconds)).toDateString())
}

现在的问题是我得到了 "20180603T150000Z""20180603T160000Z" 相同的 unix 时间,它们应该给出不同的时间戳,而它们都是 1530576000

有什么我遗漏的吗?提前致谢。

请查看 this 的实时示例

这里有几点:

toDateString() 方法 return 是 Date 对象的日期部分,采用美式英语的人类可读形式。对于您的示例,它是“2018 年 7 月 3 日星期二”,也许这不是您想要的。

new Date 在您当地的时区创建日期,如果您将它与 toString() 一起使用,它会很好地发挥作用,它也会 return 在您当地时区的日期字符串。但它会受到夏令时变化的影响,所以我会避免使用该方法。

我想避免在字符串和日期之间来回转换的另一件事,因为它会进行很多不必要的计算。

我建议使用以下内容:

var ics_to_unix = function (ics_string) {
  var year = parseInt(ics_string.slice(0, 4));
  var month = parseInt(ics_string.slice(4, 6)) - 1; // Jan is 0
  var date = parseInt(ics_string.slice(6, 8));
  var hours = parseInt(ics_string.slice(9, 11));
  var minutes = parseInt(ics_string.slice(11, 13));
  var seconds = parseInt(ics_string.slice(13, 15));

  return Date.UTC(year, month, date, hours, minutes, seconds) / 1000;
}

我添加了字符串到数字的显式转换,调整了月份以匹配 javascript 中使用的内容,还删除了额外的调用。