Javascript日期格式,如ISO,但为本地格式

Javascript日期格式,如ISO,但为本地格式,javascript,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.getMo

如何像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)

pad=function(e,t,n){n=n | | |“0”,t=t | | 2;while(“”+e).lengthAFAIK你不能在javascript中格式化日期(不使用外部库)。你最好是“自己格式化”。我的意思是:

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

编辑:


Moment.js似乎就是您要找的东西:

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

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

    z=t.getTimezoneOffset()*60*1000

  • 从t中减去偏移量

    tLocal=t-z

  • 创建移位日期对象

    tLocal=新日期(tLocal)

  • 转换为ISO格式字符串

    iso=tLocal.toISOString()

  • 删除毫秒和区域

    iso=iso.slice(0,19)

  • 将丑陋的“T”替换为空格

    iso=iso.替换('T','')


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

为了方便起见,我使用了Denis Howe所说的以下现成功能

还有一个修正:在原始答案中,t-z不起作用,因为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"

我不太明白你需要哪一天 但我认为你需要

   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 isolocalString=d=>{
常数pad=n=>n<10?'0'+n:n;
返回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另一种方法是在日期对象上定义原型:

Date.prototype.toLocaleISOString = function() {
  const zOffsetMs = this.getTimezoneOffset() * 60 * 1000;
  const localTimeMs = this - zOffsetMs;
  const date = new Date(localTimeMs);
  const utcOffsetHr = this.getTimezoneOffset() / 60;
  const utcOffsetSign = utcOffsetHr <= 0 ? '+' : '-';
  const utcOffsetString = utcOffsetSign + (utcOffsetHr.toString.length == 1 ? `0${utcOffsetHr}` : `${utcOffsetHr}`) + ':00';
  return date.toISOString().replace('Z', utcOffsetString);
};
它只是一种格式化日期的方法,因此可以应用于任何时区

您是否尝试过对象的
toLocaleString
方法的
timeZone
选项


有示例的答案。

没有直接的方法。但是,您可以使用
toLocaleString
创建一个字符串,您可以轻松解析该字符串,使其成为ISO字符串

这适用于以下节点:

getLocalIsoTime(时间、时区){
const local=time.tolocalString(“en-US”,{时区:时区,小时12:false,年:“数字”,月:“2位”,日:“2位”,小时:“2位”,分钟:“2位”,秒:“2位”});
返回`${local.substr(6,4)}-${local.substr(0,2)}-${local.substr(3,2)}T${local.substr(12,8)}`;
}
更简单的版本适用于node 15+和大多数现代浏览器:

getLocalIsoTime(时间、时区){
返回时间.tolocalString(“en-CA”,{timeZone:timeZone,hour12:false}).replace(/,/,“T”);
}

有点老套,但可以利用瑞典使用非常接近ISO的格式,一行完成:

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

以及
.getMonth()返回的月份
si没有填充,所以我想我也需要一个库来填充它-看起来很费劲!是的,确实如此。这是一个很大的工作,这就是为什么我建议使用矩.js或其他库。小更正:
t-z
在原始答案中确实有效,因为它相当于
getTime
,所以任何隐式使用该函数的东西都会遇到hod,就像减法和一元数
+
(例如
+新日期(2020,0,1)
)一样,将使用毫秒数。好的-我仍然在使用该代码,我想,可能会在某个时候尝试这种方法。这种方法非常有效。我确实必须将切片更改为
(0,16)
以适应
,由于某些原因,它需要时分而无秒。请注意,如果本地时区在UTC之后,偏移量为正,如果在UTC之前,偏移量为负。这就是为什么您必须减去它,而不是添加它。只需添加:如果您想再次读取final
iso
作为日期对象:
newD=new Date(Date.parse(iso));
@OmSao在该表达式中使用Date.parse是多余的,
新日期(iso);
将产生相同的结果。您所完成的操作不包括时区偏移。
Date.prototype.toLocaleISOString = function() {
  const zOffsetMs = this.getTimezoneOffset() * 60 * 1000;
  const localTimeMs = this - zOffsetMs;
  const date = new Date(localTimeMs);
  const utcOffsetHr = this.getTimezoneOffset() / 60;
  const utcOffsetSign = utcOffsetHr <= 0 ? '+' : '-';
  const utcOffsetString = utcOffsetSign + (utcOffsetHr.toString.length == 1 ? `0${utcOffsetHr}` : `${utcOffsetHr}`) + ':00';
  return date.toISOString().replace('Z', utcOffsetString);
};
const date = new Date();
console.log(date.toLocaleISOString());
// Output: 2020-08-04T14:52:38.613-07:00
// Returns a string like 2021-01-17T01:59:57
function dateToISOButLocal(date) {
    return date.toLocaleString('sv').replace(' ', 'T');
}