Javascript 日期格式,如 ISO 但本地

IT技术 javascript
2021-03-09 11:43:09

如何像 ISO 格式一样格式化 javascript 日期,但在本地时间?

myDate.toISOString()我收到时间:“2012-09-13T19:12:23.826Z”

但在这里,它是 22:13,那么我如何以上述格式包含时区?


我最终做了...

pad=function(e,t,n){n=n||"0",t=t||2;while((""+e).length<t)e=n+e;return e}
c = new Date()
c.getFullYear()+"-"+pad(c.getMonth()+1)+"-"+pad(c.getDate()-5)+"T"+c.toLocaleTimeString().replace(/\D/g,':')+"."+pad(c.getMilliseconds(),3)
6个回答

不需要图书馆!对于某些Date对象,例如t = new Date()

  • 将本地时区偏移量从分钟转换为毫秒

    z = t.getTimezoneOffset() * 60 * 1000

  • 从 t 中减去偏移量

    tLocal = t-z

  • 创建移位日期对象

    tLocal = new Date(tLocal)

  • 转换为 ISO 格式字符串

    iso = tLocal.toISOString()

  • 删除毫秒和区域

    iso = iso.slice(0, 19)

  • 用空格替换丑陋的“T”

    iso = iso.replace('T', ' ')

结果是一个很好的 ISO-ish 格式日期时间字符串,如本地时区中的“2018-08-01 22:45:50”。

@OmSao——在该表达式中使用Date.parse是多余的,new Date(iso);将产生相同的结果。
2021-04-30 11:43:09
请注意,如果本地时区落后于 UTC,则偏移量为正,如果领先则为负。这就是为什么你必须减去它而不是添加它。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-05-11 11:43:09
只是添加:如果你想再次阅读 finaliso作为日期对象: newD = new Date(Date.parse(iso));
2021-05-20 11:43:09

有点黑客,但可以利用瑞典使用非常接近 ISO 的格式这一事实在一行中完成:

// Returns a string like 2021-01-17T01:59:57
function dateToISOButLocal(date) {
    return date.toLocaleString('sv').replace(' ', 'T');
}
我喜欢这个!简单干净,坦率地说,只要它有效,我就不在乎外观。
2021-05-14 11:43:09
你甚至不再需要replace(): date.toLocaleDateString('sv')此外,如果您需要特定时区的日期,这个 hack 非常好:date.toLocaleDateString('sv', {timeZone: 'America/New_York'})
2021-05-17 11:43:09

为了方便起见,我采用了 Denis Howe 所说的作为现成的功能。

还有一个解决方法:在原始答案中 tz 不起作用,因为 t 是日期,而不是毫秒。

function dateToISOLikeButLocal(date) {
    const offsetMs = date.getTimezoneOffset() * 60 * 1000;
    const msLocal =  date.getTime() - offsetMs;
    const dateLocal = new Date(msLocal);
    const iso = dateLocal.toISOString();
    const isoLocal = iso.slice(0, 19);
    return isoLocal;
}

有了这个,我得到了需要作为 URL 参数的字符串类型:

"2018-11-16T12:23:50"
小更正:t-z在原始答案中确实有效,因为Date.prototype.valueOf等效于getTime,因此任何隐式使用该方法的内容,例如减法和一元+(例如+new Date(2020, 0, 1)),都将使用毫秒数。有关对象到原始转换的更多信息
2021-04-21 11:43:09
这就像一个魅力。我确实必须将切片更改(0, 16)为适应<input type="datetime-local">,出于某种原因,它需要几小时和几分钟而没有秒。
2021-04-23 11:43:09
好的 - 我认为我仍在使用该代码,可能会在某个时候尝试这种方式
2021-05-05 11:43:09

AFAIK 你不能在 javascript 中格式化日期(不使用外部库)。你能做的最好的事情就是“自己格式化”。我是说:

var date = new Date();
var year = date.getFullYear();
var month = date......


var ISOdate = year + "-" + month + "-" + .... ;

但是有一些很好的库可以让你格式化日期!(阅读“格式”如library.getDate("YYYY-MM-DD.........");

编辑:

Moment.js 似乎是你正在寻找的东西:http ://momentjs.com/

并且.getMonth()si返回的月份没有被填充,所以我想我也需要一个图书馆来填充它 - 看起来很多东西!
2021-05-06 11:43:09
确实是的。这是很多工作,这就是为什么我建议使用 Moment.js 或其他一些库。
2021-05-15 11:43:09

我不太明白你需要哪个日期,但我认为你需要

   const ISOLocaleString = d => {
       const pad = n => n < 10 ? '0'+n : n;    
       return d.getFullYear()+'-'
            + pad(d.getMonth()+1)+'-'
            + pad(d.getDate())+'T'
            + pad(d.getHours())+':'
            + pad(d.getMinutes())+':'
            + pad(d.getSeconds())+'Z'
   }

或者

    const ISOUTCLocaleString = d => {
        const pad = n => n<10 ? '0'+n : n;    
        return d.getUTCFullYear()+'-'
             + pad(d.getUTCMonth()+1)+'-'
             + pad(d.getUTCDate())+'T'
             + pad(d.getUTCHours())+':'
             + pad(d.getUTCMinutes())+':'
             + pad(d.getUTCSeconds())+'Z'
    }