javascript - 如何在 JavaScript 中将日期时间转换为 UTC+1
问题描述
我们在 node-red 中创建了一个函数,我们在其中清理从传感器元数据接收到的日期时间。不幸的是,获取的时区晚了一小时,因此发送了“错误的日期时间”。我们需要将此日期时间转换为 UTC+1('Europe/Berlin')。该函数在 JavaScript 中,据我所知,我们不能使用诸如moment等第三方库。
希望这里有人可以帮助我们。提前致谢!
这是我们迄今为止所做的:
var time = msg.metadata.time;
var datetime = new Date().toLocaleString();
var timedate = new Date(time);
var y = timedate.getFullYear().toString();
var m = (timedate.getMonth() + 1).toString();
var d = timedate.getDate().toString();
(d.length == 1) && (d = '0' + d);
(m.length == 1) && (m = '0' + m);
timedate.setHours(timedate.getHours() + 1)
var h = timedate.getHours().toString();
var min = timedate.getMinutes().toString();
var s = timedate.getSeconds().toString();
(h.length == 1) && (h = '0' + h);
(min.length == 1) && (min = '0' + min);
(s.length == 1) && (s = '0' + s);
var date = y+'-'+m+'-'+d
var time = h + ":" + min + ":" + s;
var timeDate = date+' '+time;
解决方案
我会考虑使用Date.toLocaleString()进行日期/时间转换。
现在 Moment.js 如果你可以使用它会更好,但你可以像下面这样转换时间。
请记住,您必须考虑 DST 更改,而使用您自己的代码很难解释这些更改(DST 切换的确切日期每年都在变化)。
例如,柏林从 10 月下旬到 3 月下旬使用 CET (UTC+1),从 3 月下旬到 10 月下旬使用 CEST (UTC+2)。
为什么我使用“sv”的语言环境,这是因为它本质上会给我们一个 ISO 8601 时间戳。当然,要转换为文本,您可以使用任何语言环境。
我添加了一个 getUTCOffsetMinutes 函数,该函数将以分钟为单位返回给定 UTC 时间和时区的 UTC 偏移量。
IANA 时区列表在这里:时区列表
const time = 1559347200000; // 2019-06-01T00:00:00Z
console.log("UTC time 1:", new Date(time).toISOString());
console.log("Berlin time 1 (ISO):", new Date(time).toLocaleString("sv", { timeZone: "Europe/Berlin"}));
console.log("Berlin time 1 (de):", new Date(time).toLocaleString("de", { timeZone: "Europe/Berlin"}));
const time2 = 1575158400000; // 2019-12-01T00:00:00Z
console.log("UTC time 2:", new Date(time2).toISOString());
console.log("Berlin time 2 (ISO):", new Date(time2).toLocaleString("sv", { timeZone: "Europe/Berlin"}));
console.log("Berlin time 2 (de):", new Date(time2).toLocaleString("de", { timeZone: "Europe/Berlin"}));
// You can also get the UTC offset using a simple enough function:
// Again, this will take into account DST
function getUTCOffsetMinutes(unixDate, tz) {
const localTimeISO = new Date(unixDate).toLocaleString("sv", {timeZone: tz}).replace(" ", "T") + "Z";
return (new Date(localTimeISO).getTime() - unixDate) / 60000; // Milliseconds to minutes.
}
console.log("UTC offset minutes (June/Berlin):", getUTCOffsetMinutes(time, "Europe/Berlin"));
console.log("UTC offset minutes (June/LA):", getUTCOffsetMinutes(time, "America/Los_Angeles"));
console.log("UTC offset minutes (June/Sydney):",getUTCOffsetMinutes(time, "Australia/Sydney"));
console.log("UTC offset minutes (December/Berlin):", getUTCOffsetMinutes(time2, "Europe/Berlin"));
console.log("UTC offset minutes (December/LA):", getUTCOffsetMinutes(time2, "America/Los_Angeles"));
console.log("UTC offset minutes (December/Sydney):", getUTCOffsetMinutes(time2, "Australia/Sydney"));
推荐阅读
- python - 如何确定熊猫数据中每分钟的条目数
- asp.net - 网站上的谷歌地图链接不起作用
- c++ - 谁能解释为什么地址运算符返回字符串而不是以下 C++ 程序中的地址?
- python - 如何按时间值对 CSV 中的数据帧进行分组,以便我可以计算每小时的频率?
- xml - xsd 用于在指定属性的情况下允许默认和子标签的字符串内容的标签
- c# - ConcurrentExclusiveSchedulerPair 是否保证单线程?
- matlab - 随时间测量不同神经元的尖峰相关性
- java - 正则表达式:匹配某个目录下的任何文件,除非叶子目录被称为“脚本”
- r - 如何使用共享数据库将多个 Shiny 应用程序集成到一个网站中?
- java - 在 Tensorflow for Java 中加载预训练模型