javascript toISOString()忽略时区偏移量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript toISOString()忽略时区偏移量相关的知识,希望对你有一定的参考价值。
我正在尝试将Twitter日期时间转换为本地iso-string(对于prettyDate),现在为期2天。我只是没有让当地时间正确..
即时通讯使用以下功能:
function getLocalISOTime(twDate) {
var d = new Date(twDate);
var utcd = Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(),
d.getMinutes(), d.getSeconds(), d.getMilliseconds());
// obtain local UTC offset and convert to msec
localOffset = d.getTimezoneOffset() * 60000;
var newdate = new Date(utcd + localOffset);
return newdate.toISOString().replace(".000", "");
}
在newdate一切都很好,但toISOString()再次将它重新回到原来的时间......任何人都可以帮我从Twitter日期中获取当地时间格式为:星期四,2012年5月31日08:33:41 +0000
moment.js
很棒,但有时你不想为简单的东西拉大量的依赖。
以下工作原理:
var tzoffset = (new Date()).getTimezoneOffset() * 60000; //offset in milliseconds
var localISOTime = (new Date(Date.now() - tzoffset)).toISOString().slice(0, -1);
// => '2015-01-26T06:40:36.181'
slice(0, -1)
摆脱了代表祖鲁时区的尾随Z
,可以用你自己的替换。
我没有使用时刻的解决方案是将其转换为时间戳,添加时区偏移量,然后转换回日期对象,然后运行toISOString()
var date = new Date(); // Or the date you'd like converted.
isoDate = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString();
下面的日期函数无需额外的脚本库即可实现所需的效果。基本上它只是一个简单的日期组件连接,格式正确,并增加了Date对象的原型。
Date.prototype.dateToISO8601String = function() {
var padDigits = function padDigits(number, digits) {
return Array(Math.max(digits - String(number).length + 1, 0)).join(0) + number;
}
var offsetMinutes = this.getTimezoneOffset();
var offsetHours = offsetMinutes / 60;
var offset= "Z";
if (offsetHours < 0)
offset = "-" + padDigits(offsetHours.replace("-","") + "00",4);
else if (offsetHours > 0)
offset = "+" + padDigits(offsetHours + "00", 4);
return this.getFullYear()
+ "-" + padDigits((this.getUTCMonth()+1),2)
+ "-" + padDigits(this.getUTCDate(),2)
+ "T"
+ padDigits(this.getUTCHours(),2)
+ ":" + padDigits(this.getUTCMinutes(),2)
+ ":" + padDigits(this.getUTCSeconds(),2)
+ "." + padDigits(this.getUTCMilliseconds(),2)
+ offset;
}
Date.dateFromISO8601 = function(isoDateString) {
var parts = isoDateString.match(/d+/g);
var isoTime = Date.UTC(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5]);
var isoDate = new Date(isoTime);
return isoDate;
}
function test() {
var dIn = new Date();
var isoDateString = dIn.dateToISO8601String();
var dOut = Date.dateFromISO8601(isoDateString);
var dInStr = dIn.toUTCString();
var dOutStr = dOut.toUTCString();
console.log("Dates are equal: " + (dInStr == dOutStr));
}
用法:
var d = new Date();
console.log(d.dateToISO8601String());
希望这有助于其他人。
编辑
更正了评论中提到的UTC问题,并将Alex归功于dateFromISO8601
函数。
moment.js FTW !!!
只需将您的日期转换为片刻并按照您的要求操纵它:
var d = new Date(twDate);
var m = moment(d).format();
console.log(m);
// example output:
// 2016-01-08T00:00:00-06:00
以上是关于javascript toISOString()忽略时区偏移量的主要内容,如果未能解决你的问题,请参考以下文章
date-fns 中的啥方法相当于 moment().toISOString()
TypeError:formats.dateTimeString.toISOString 不是函数
toISOString 在 iPhone 中无法与 Cordova Ionic 一起使用