Javascript日期格式,如ISO但本地

时间:2012-09-13 19:15:18

标签: 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)

9 个答案:

答案 0 :(得分: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格式的日期时间字符串,例如本地时区中的“ 2018-08-01 22:45:50”。

答案 1 :(得分:5)

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/

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

我不太了解您需要哪个日期 但我认为您需要

   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'
    }

答案 4 :(得分:1)

为了方便起见,下面我将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"

答案 5 :(得分:0)

另一种方法是在Date对象上定义原型:

Mappings:
  stage1:
    us-west-2:
      MyVar: 15
  stage2:
    us-west-2:
      MyVar: 15
  stage3:
    eu-west-1:
      MyVar: 20
    us-east-1:
      MyVar: 30

使用它非常简单:

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);
};

答案 6 :(得分:0)

ISO 8601只是格式化日期的一种方法,因此可以应用于任何时区。

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

This question包含示例答案。

答案 7 :(得分:0)

没有直接的方法可以做到这一点。但是,您可以使用toLocaleString创建一个字符串,您可以轻松地对其进行分析以使其成为ISO字符串。

这适用于节点:

    getLocalIsoTime(time, timezone) {
        const local = time.toLocaleString("en-US", {timeZone: timezone, hour12: false, year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
        return `${local.substr(6, 4)}-${local.substr(0, 2)}-${local.substr(3, 2)}T${local.substr(12, 8)}`;
    }

一个更简单的版本可在节点15+和大多数现代浏览器上使用:

    getLocalIsoTime(time, timezone) {
        return time.toLocaleString("en-CA", {timeZone: timezone, hour12: false}).replace(/, /, "T");
    }

答案 8 :(得分:0)

这是我使用的方法。如果日期/月份/小时等是个位数(例如将“6”变为“06”),请注意添加零

function formatLikeISO (d: Date): string {
    let lengthChecker = (str) => {
        if (str.length == 1) { return '0' + str; }
        return str;
    }

    let theDate = lengthChecker(String(d.getDate()));
    let month = lengthChecker(String(d.getMonth() + 1));
    let mins = lengthChecker(String(d.getMinutes()));
    let hours = lengthChecker(String(d.getHours()));
    let secs = lengthChecker(String(d.getSeconds()));

    let formatted =
        d.getFullYear() + '-' +
        month + '-' +
        theDate + ' ' +
        hours + ':' +
        mins + ':' +
        secs;

    return formatted;
}

这将输出这种格式:

<块引用>

"2021-06-30 11:31:34"

相关问题