【问题标题】:Convert string to Date without considering timezone - Typescript在不考虑时区的情况下将字符串转换为日期 - 打字稿
【发布时间】:2019-03-15 14:00:56
【问题描述】:

我得到一个字符串形式的日期,格式如下(例如):

"11/10/2015 10:00:00"

这是 UTC 时间。

当我从这个字符串创建日期时,它认为它是本地时间:

let time = "11/10/2015 10:00:00";
let date = new Date(time); 
console.log(date);

打印出来:

"Tue Nov 10 2015 10:00:00 GMT+0200"

(而不是将其视为 UTC:“Tue Nov 10 2015 10:00:00”)

我也为此尝试了 moment.js。

有没有一种好方法可以让 Date() 将字符串视为 UTC,而不在字符串末尾添加“Z”/“UTC”/“+000”?

【问题讨论】:

  • 你可以使用moment.utc("11/10/2015 10:00:00", "MM/DD/YYYY HH:mm:ss"),你想要一个原生的JavaScript解决方案吗?
  • @VincenzoC Date.UTC() 在本地做同样的事情

标签: javascript typescript date momentjs


【解决方案1】:

您可以为此使用Date.UTC,但您必须自己解析字符串并将其每个部分都作为args,因为它无法解析这样的字符串。你也可以使用moment.js 来解析它:Convert date to another timezone in JavaScript

另外,new Date("11/10/2015 10:00:00 GMT") 似乎将日期解析为 GMT,然后才将其转换为 PC 本地时间

【讨论】:

  • "另外,好像……" 值得注意的是,“11/10/2015 10:00:00 GMT”不是 EMCA-262 支持的格式,因此解析是实现依赖。它也是模棱两可的,大多数人会认为它是 10 月 11 日,但解析器可能会将其视为 11 月 10 日。
【解决方案2】:

您可以使用内置的Date.UTC() 函数来执行此操作。这是一个小函数,它将采用您在原始帖子中提供的格式并将其转换为 UTC 日期字符串

let time = "11/10/2015 10:00:00";

function getUTCDate(dateString) {
  // dateString format will be "MM/DD/YYYY HH:mm:ss"
  var [date, time] = dateString.split(" ");
  var [month, day, year] = date.split("/");
  var [hours, minutes, seconds] = time.split(":");
  // month is 0 indexed in Date operations, subtract 1 when converting string to Date object
  return new Date(Date.UTC(year, month - 1, day, hours, minutes, seconds)).toUTCString();
}

console.log(getUTCDate(time));

【讨论】:

  • 您假设月/日/年格式,但鉴于 OP 发布于 2018-10-10 15:36:59Z,它更有可能是更常见的日/月/年格式。 ;-)
  • @RobG OP 希望“2015 年 11 月 10 日”吐出,对吗?输入"11/10/2015" 这正是您将得到的。出于这个原因,我假设它是“月/日/年”,除非我错过了什么?
  • OP 说“它打印”,而不是“我想要”。您可能是正确的,但不确定。
  • 抱歉不清楚,我的意思是我预计:“Tue Nov 10 2015 10:00:00”(没有“+0200”)
【解决方案3】:

日期构造函数以 MM/DD/YYYY 格式解析您的日期,并应用本地时区偏移量(因此输出表示相关日期开始时的本地午夜)。如果您的日期确实是 MM/DD/YYYY,您需要做的就是减去时区偏移量,您将获得 UTC 日期...

var myDate = new Date("11/10/2015 10:00:00");
myDate = new Date( myDate.getTime() - (myDate.getTimezoneOffset()*60*1000));
console.log(myDate.toLocaleString([],{timeZone:'UTC'}))

Here's everything I know 关于在序列化和反序列化日期时管理时区。所有时区处理都是静态的! JS 日期没有固有时区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多