Javascript日期格式,如ISO但本地

Bil*_*oon 10 javascript

如何格式化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)
Run Code Online (Sandbox Code Playgroud)

ant*_*ont 12

为了方便起见,我采用了 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;
}
Run Code Online (Sandbox Code Playgroud)

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

"2018-11-16T12:23:50"
Run Code Online (Sandbox Code Playgroud)

  • 小修正:原始答案中的“tz”确实有效,因为 [`Date.prototype.valueOf`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/valueOf ) 相当于 `getTime`,因此任何隐式使用该方法的操作,例如减法和一元 `+`(例如 `+new Date(2020, 0, 1)`),都将使用毫秒数。[有关对象到基元转换的更多信息](https://javascript.info/object-toprimitive) (2认同)
  • 这就像一个魅力。我确实必须将切片更改为 `(0, 16)` 以适应 `&lt;input type="datetime-local"&gt;`,由于某种原因,它需要小时和分钟而不需要秒。 (2认同)

All*_*ice 11

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

// Returns a string like 2021-01-17T01:59:57
function dateToISOButLocal(date) {
    return date.toLocaleString('sv').replace(' ', 'T');
}
Run Code Online (Sandbox Code Playgroud)

  • 您甚至不再需要“replace()”:“date.toLocaleDateString('sv')”。另外,如果您需要特定时区的日期,这个技巧非常好:`date.toLocaleDateString('sv', {timeZone: 'America/New_York'})` (4认同)

Den*_*owe 10

无需图书馆!对于某些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格式的日期时间字符串,例如本地时区中的“ 2018-08-01 22:45:50”。

  • 请注意,如果本地时区晚于 UTC,则偏移量为正,如果早于 UTC,则偏移量为负。这就是为什么你必须减去它而不是加上它。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset (3认同)

Tza*_*Leh 7

尽管这里的答案可能有效,但没有什么比简单的一句台词更好的了:

new Date(new Date().getTime() - new Date().getTimezoneOffset() * 60 * 1000).toISOString()
Run Code Online (Sandbox Code Playgroud)
给有兴趣的人解释一下:

我们创建一个新的 Date 实例(外部实例)。
我们给它另一个 Date 实例(以毫秒为单位),从中减去时区偏移量(也以毫秒为单位,正数或负数)。所有这些我们都格式化为 ISO


ale*_*nst 6

AFAIK你不能在javascript中格式化日期(不使用外部库).你能做的最好的事情就是"自己格式化".我的意思是:

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


var ISOdate = year + "-" + month + "-" + .... ;
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

  • 并且 `.getMonth()` 返回的月份没有填充,所以我想我也需要一个库来填充它 - 看起来很麻烦! (2认同)