javascript toISOString()忽略时区偏移量

时间:2012-05-31 08:57:24

标签: javascript datetime timezone-offset

我正在尝试将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中获取当地的iso时间格式为: 星期四,2012年5月31日08:33:41 +0000

7 个答案:

答案 0 :(得分:181)

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,可以由你自己替换。

答案 1 :(得分:58)

我没有使用时刻的解决方案是将其转换为时间戳,添加时区偏移量,然后转换回日期对象,然后运行toISOString()

var date = new Date(); // Or the date you'd like converted.
isoDate = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString();

答案 2 :(得分:7)

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

http://momentjs.com/docs/

答案 3 :(得分:7)

下面的日期函数可以在没有其他脚本库的情况下实现所需的效果。基本上它只是一个简单的日期组件连接,格式正确,并扩充了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问题,并将dateFromISO8601功能归功于Alex

答案 4 :(得分:2)

使用export function job(state = {}, action) { case jobConstants.JOB_SEARCH_SUCCESS: return { ...state, StartLoc: action.newStart, EndLoc: action.newEnd, initStart: action.initStart, initEnd: action.initEnd, pagMax: action.pagMax, SearchStrtLoc: action.snewStart, SearchEndLoc: action.snewEnd, SearchIntStrt: action.sinitStart, SearchIntEnd: action.sinitEnd, searchOn: action.searchOn, filterOn: action.filterOn }; } ,可以使用moment.js的{​​{1}}参数:

keepOffset

toISOString

答案 5 :(得分:0)

Moment js解决方案是

var d = new Date(new Date().setHours(0,0,0,0));
m.add(m.utcOffset(), 'm')
m.toDate().toISOString()
// output "2019-07-18T00:00:00.000Z"

答案 6 :(得分:0)

获取当前日期和时间将非常有帮助。

var date=new Date();
  var today=new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString().replace(/T/, ' ').replace(/\..+/, '');