初始化 javascript 日期为 "America/New_York" 中的中午



我有一个时区作为IANA时区列表中的规范名称(例如"America/New_York"(。我没有GMT+值,它随着夏令时的变化而变化,我不想去想。

我在目标时区有一个我想要的时间,例如2000年7月12日中午。

如何将javascript日期初始化为该时间?

对于这种类型的转换,最好使用专用的日期/时间库,如luxon

我们在所需时区中创建一个DateTime对象,然后转换为本地。

DateTime对象可以使用.toJSDate((.转换为JavaScript日期

const { DateTime } = luxon;
const zone = 'America/New_York';
const obj = { year: 2000, month: 7, day: 12, hour: 12 };
const timeInZone = DateTime.fromObject(obj , { zone });
const localtime = timeInZone.toLocal();
console.log('Time in zone:', timeInZone.toString());
console.log('Local time:  ', localtime.toString());
console.log('Local time (JSDate):', localtime.toJSDate().toString());
.as-console-wrapper { max-height: 100% !important; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/3.0.1/luxon.min.js" integrity="sha512-6ZJuab/UnRq1muTChgrVxJhSgygmL2GMLVmSJN7pcBEqJ1dWPbqN9CiZ6U3HrcApTIJsLnMgXYBYgtVkJ8fWiw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

这个可以在普通JavaScript中完成,但它要尴尬得多。

我们必须为给定时区中的时间搜索相应的UTC时间。

一旦我们有了这个,我们可以在当地时间显示。

function convertToLocal(date, timeZone) {
const dt = Date.parse(toIso(date) + 'Z');
// Test the entire range of offsets
for(let offsetMinutes = -900; offsetMinutes <= 900; offsetMinutes += 15) {
const test = new Date(dt + offsetMinutes * 60000);
if (toIso(date) === toIso(test, timeZone)) { 
return test;
}
}
}
function toIso(date, timeZone) { 
const opt = {
year: 'numeric', month: '2-digit', day: '2-digit',
hour: '2-digit', minute: '2-digit', second: '2-digit', 
fractionalSecondDigits: 3, timeZone
};
return new Date(date).toLocaleString('sv', opt).replace(' ', 'T').replace(',', '.');
}
let zone = 'America/New_York'
let timeInZone = '2000-07-12T12:00:00.000';
console.log('Time in zone:', timeInZone);
console.log('Local time:  ', toIso(convertToLocal(timeInZone, zone)));
.as-console-wrapper { max-height: 100% !important; }

相关内容

最新更新