如何格式化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)
答案 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)
答案 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"