将UTC日期时间转换为本地日期时间。

534

我从服务器获取的日期时间变量格式为:6/29/2011 4:52:48 PM,并且它是以UTC时间表示的。 我希望使用JavaScript将其转换为当前用户的浏览器时区。

请问如何使用JavaScript或jQuery实现?


代码示例在此处: https://dev59.com/vG865IYBdhLWcg3wZdxW - Andrew Lewis
7
注意,这是一个奇怪的日期格式,所以一定要在使用任何解决方案时明确指定它。如果可能的话,让服务器以ISO格式发送日期。 - Michael Scheper
你好,我曾经遇到过类似的问题,我通过在将日期/时间发送到服务器之前进行转换来解决它,使用以下代码:var date = new Date('2020-11-06T01:30:00.000Z'); console.log(date.toLocaleDateString()); console.log(date.toLocaleString()); console.log(date.toLocaleTimeString()); - FXLima
我的评论是关于示例: (UTC 巴西) 我输入了“15/12/2020 22:30:00”,它发送了:'2020-12-16T01:30:00.000Z'。 - FXLima
39个回答

3

如果有人需要一个函数,将转换后的时间显示到特定的id元素中,并应用日期格式字符串yyyy-mm-dd。其中date1是字符串,ids是要显示时间的元素的id。

function convertUTCDateToLocalDate(date1, ids) 
{
  var newDate = new Date();
  var ary = date1.split(" ");
  var ary2 = ary[0].split("-");
  var ary1 = ary[1].split(":");
  var month_short = Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
  newDate.setUTCHours(parseInt(ary1[0]));
  newDate.setUTCMinutes(ary1[1]);
  newDate.setUTCSeconds(ary1[2]);
  newDate.setUTCFullYear(ary2[0]);
  newDate.setUTCMonth(ary2[1]);
  newDate.setUTCDate(ary2[2]);
  ids = document.getElementById(ids);
  ids.innerHTML = " " + newDate.getDate() + "-" + month_short[newDate.getMonth() - 1] + "-" + newDate.getFullYear() + " " + newDate.getHours() + ":" + newDate.getMinutes() + ":" + newDate.getSeconds();
            }

我知道这个答案已经被接受了,但是我是通过谷歌搜索到这里的,我从已接受的答案中获得灵感并解决了问题,所以我想分享一下,如果有人需要的话。


2
使用dayjs库:
(new Date()).toISOString();  // returns 2021-03-26T09:58:57.156Z  (GMT time)

dayjs().format('YYYY-MM-DD HH:mm:ss,SSS');  // returns 2021-03-26 10:58:57,156  (local time)

(在nodejs中,使用它之前你必须这样做:const dayjs = require('dayjs'); 在其他环境中,请参阅dayjs文档。)

2

这在我的端上运行正常

选项1:如果日期格式类似于“yyyy-mm-dd”或“yyyy-mm-dd H:n:s”,例如:“2021-12-16 06:07:40”

由于这种格式无法确定是本地格式还是UTC时间,因此我们需要确保JS知道它是一个UTC时间。因此,我们需要将日期设置为UTC。

        function setDateAsUTC(d) {
            let date = new Date(d);
            return new Date(
                Date.UTC(
                    date.getFullYear(),
                    date.getMonth(),
                    date.getDate(),
                    date.getHours(),
                    date.getMinutes(),
                    date.getSeconds()
                )
            );
        }

然后使用它


let d = "2021-12-16 06:07:40";
setDateAsUTC(d).toLocaleString();

// output: 12/16/2021, 6:07:40 AM

选项2: 如果UTC日期格式是ISO-8601。大多数服务器的时间戳格式都是ISO-8601,例如:'2011-06-29T16:52:48.000Z'。使用这种格式,我们只需将其传递给date函数和toLocaleString()函数即可。

let newDate = "2011-06-29T16:52:48.000Z"
new Date(newDate).toLocaleString();
//output: 6/29/2011, 4:52:48 PM

1
基于@digitalbath的回答,这里有一个小函数可以获取UTC时间戳并在给定的DOM元素中显示本地时间(使用jQuery进行最后一部分):

https://jsfiddle.net/moriz/6ktb4sv8/1/

<div id="eventTimestamp" class="timeStamp">
   </div>
   <script type="text/javascript">
   // Convert UTC timestamp to local time and display in specified DOM element
   function convertAndDisplayUTCtime(date,hour,minutes,elementID) {
    var eventDate = new Date(''+date+' '+hour+':'+minutes+':00 UTC');
    eventDate.toString();
    $('#'+elementID).html(eventDate);
   }
   convertAndDisplayUTCtime('06/03/2015',16,32,'eventTimestamp');
   </script>

1
你可以使用 momentjsmoment(date).format() 总是以本地日期的形式呈现结果。 额外奖励,你可以按照任何方式格式化。例如:
moment().format('MMMM Do YYYY, h:mm:ss a'); // September 14th 2018, 12:51:03 pm
moment().format('dddd');                    // Friday
moment().format("MMM Do YY"); 

如需更多详细信息,请参考Moment js网站


1

tl;dr (new Date('6/29/2011 4:52:48 PM UTC')).toString()

源字符串必须指定时区或UTC。

一行代码:

(new Date('6/29/2011 4:52:48 PM UTC')).toString()

在我的一个网络浏览器中的结果:
"Wed Jun 29 2011 09:52:48 GMT-0700 (Pacific Daylight Time)"

这种方法甚至可以适当选择标准/日光节约时间。
(new Date('1/29/2011 4:52:48 PM UTC')).toString()

在我的浏览器中的结果:

"Sat Jan 29 2011 08:52:48 GMT-0800 (Pacific Standard Time)"

1
在我的情况下,我需要找到两个日期之间的秒数差异。该日期是一个UTC日期字符串,因此我将其转换为本地日期对象。这是我所做的:
let utc1 = new Date();
let utc2 = null;
const dateForCompare = new Date(valueFromServer);
dateForCompare.setTime(dateForCompare.getTime() - dateForCompare.getTimezoneOffset() * 
 60000);
utc2 = dateForCompare;

const seconds = Math.floor(utc1 - utc2) / 1000;

1
这对我在Safari/Chrome/Firefox中非常有效:
const localDate = new Date(`${utcDate.replace(/-/g, '/')} UTC`);

1

我相信这是最好的解决方案:

  let date = new Date(objDate);
  date.setMinutes(date.getTimezoneOffset());

这将根据以分钟表示的偏移量适当地更新您的日期。

0
在Angular中,我是这样使用Ben的答案的:
$scope.convert = function (thedate) {
    var tempstr = thedate.toString();
    var newstr = tempstr.toString().replace(/GMT.*/g, "");
    newstr = newstr + " UTC";
    return new Date(newstr);
};

更新:Angular 1.3.0 版本已经为日期过滤器添加了 UTC 支持,虽然我还没有使用过,但应该更加容易,以下是格式:

{{ date_expression | date : format : timezone}}

Angular 1.4.3日期API


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