在 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 中使用的内容,还删除了额外的调用。
我有两个 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 中使用的内容,还删除了额外的调用。