我有两个格式时间戳,我想先将它们转换为正常时间,然后再转换为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了解实时示例
答案 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中使用的内容,并删除了额外的调用。