将UTC时间转换为本地时间的Javascript

49

好的,假设有以下JSON解析字符串UTC时间:

2012-11-29 17:00:34 UTC

现在如果我想将这个UTC时间转换为本地时间,我该怎么做?

如何将其格式化为其他形式,例如yyyy-MM-dd HH:mm:ss z

date.toString('yyyy-MM-dd HH:mm:ss z'); 从来没有起作用:/


3
new Date("2012-11-29 17:00:34 UTC") 将会显示为使用该页面的客户端的本地时间。 - Esailija
你可以使用空格或符号将其拆分为数组。假设你使用 .split(" "),那么将形成一个包含日期、时间和 "utc" 的数组。 然后再像这样拆分 .split("-") 并像这样拆分时间 .split(":") 等等。 - yashas123
只是为了任何在这里搜索的人。值得记住,在MYSQL中,绝对完美地转换到任何时区(包括完美地关注夏令时)非常容易。由于几乎所有数据都来自服务器上的mysql,因此请记住这一点。 - Fattie
10个回答

55

尝试:

var date = new Date('2012-11-29 17:00:34 UTC');
date.toString();

13
嗯,我试过IE和Firefox,它们都是NAN!无效日期? - lannyboy
使用date.js库这个链接可以处理日期格式yyyy-MM-dd HH:mm:ss。 - Pradyut Bhattacharya
2012/11/29 <--试一下 - aztack
这是否与客户端的时区有关?如果您存储了许多UTC日期,但在网站上需要为所有客户指定特定的本地时间,您会如何处理? - ffritz
4
只有在Chrome浏览器上才能正常工作,Mozilla Firefox和IE11不能使用。你有其他浏览器的解决方案吗? - Hardik
3
Date原型上没有一种方法以本地时间而非 GMT/UTC 返回日期对象似乎有些愚蠢。 - oldboy

43
var offset = new Date().getTimezoneOffset();

offset 是指本地时间和 UTC 之间的时间差,单位为分钟。如果要从 UTC 日期中获取本地时间,则需要从日期中减去这个时间差。

utc_date.setMinutes(utc_date.getMinutes() - offset);

5
我认为应该减去偏移量,而不是加上偏移量。 - OnResolve
1
  • 是合适的,因为如果时区落后1小时,则返回的值将为-60。
- Kelso Sharp
4
@OnResolve Surabhi的使用+是正确的。当使用date.getTimezoneOffset时,"从getTimezoneOffset()返回的负值表示当前位置比UTC超前,而正值则表示该位置落后于UTC"(来源:Tech Republic)。 - WebWanderer
2
至少在Chrome中,这是错误的。即使是负时区也会返回正数。 - KingOfHypocrites
2
@Surabhi @WebWanderer 那个解释显示了在这里使用 + 是不正确的。从 getTimezoneOffset() 返回的值是您需要 添加到本地时间以到达 UTC 的值。因此,如果您想从 UTC 转换为本地时间,则操作应该是 -。基本上,这个答案与请求相反,从本地时间转换为 UTC。 - Guy Passy
显示剩余3条评论

4

这里是另一种选项,使用toLocaleString()输出 mm/dd/yy:

const date = new Date('2012-11-29 17:00:34 UTC');
date.toLocaleString();
//output 11/29/2012

这是我最喜欢的一个。稍微扩展一下,toLocaleString将使用本地时区,但您也可以提供选项以获取不同的时区或显示格式。有关详细信息,请参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString。 - Mat Schaffer

2

要格式化日期,请尝试以下函数:

var d = new Date();
var fromatted = d.toLocaleFormat("%d.%m.%Y %H:%M (%a)");

但这样做的缺点是,它是一个非标准函数,在Chrome中无法工作,但在FF中可以(据我所知)。
克里斯

1
// d = "2021-09-23T15:51:48.31"

console.log(new Date(d + "z").toLocaleDateString());  // gives 9/23/2021

console.log(new Date(d + "z").toLocaleString()); // gives 9/23/2021, 10:51:48 AM
console.log(new Date(d + "z").toLocaleTimeString()); // gives 10:51:48 AM

1
你可以查看date-and-time api来轻松地进行日期操作。

let now = date.format(new Date(), 'YYYY-MM-DD HH:mm:ss', true);
console.log(now);
<script src="https://cdn.jsdelivr.net/npm/date-and-time/date-and-time.min.js"></script>


1
上述解决方案是正确的,但在FireFox和Safari中可能会崩溃!这就是webility.js试图解决的问题。检查toUTC函数,在大多数主要浏览器上都可以工作,并以ISO格式返回时间。

0

这应该可以工作。

var date = new Date('2012-11-29 17:00:34 UTC');
date.toString()

不行!Safari 不支持。 - Mr. Jo

0

这适用于 ChromeFirefox
未在其他浏览器上测试。

const convertToLocalTime = (dateTime, notStanderdFormat = true) => {
  if (dateTime !== null && dateTime !== undefined) {
    if (notStanderdFormat) {
      // works for 2021-02-21 04:01:19
      // convert to 2021-02-21T04:01:19.000000Z format before convert to local time
      const splited = dateTime.split(" ");
      let convertedDateTime = `${splited[0]}T${splited[1]}.000000Z`;
      const date = new Date(convertedDateTime);
      return date.toString();
    } else {
      // works for 2021-02-20T17:52:45.000000Z or  1613639329186
      const date = new Date(dateTime);
      return date.toString();
    }
  } else {
    return "Unknown";
  }
};

// TEST

console.log(convertToLocalTime('2012-11-29 17:00:34 UTC'));


-8
/*
 * convert server time to local time
 *  simbu
*/
function convertTime(serverdate) {
    var date = new Date(serverdate);
    // convert to utc time
    var toutc = date.toUTCString();
    //convert to local time
    var locdat = new Date(toutc + " UTC");
    return locdat;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接