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

时间:2018-06-04 11:30:12

标签: javascript date unix icalendar unix-timestamp

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

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

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

此功能很好,因为日期已经是UTC,我不需要进行任何转换。

现在这是我用来将时间转换为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。< / p>

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

请查看this了解实时示例

1 个答案:

答案 0 :(得分:1)

这里有几点:

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

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

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

我建议使用以下内容:

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中使用的内容,并删除了额外的调用。

相关问题