ChatGPT解决这个技术问题 Extra ChatGPT

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

从服务器我得到一个格式为 6/29/2011 4:52:48 PM 的日期时间变量,它是 UTC 时间。我想使用 JavaScript 将其转换为当前用户的浏览器时区。

如何使用 JavaScript 或 jQuery 做到这一点?

当心。这是一种奇怪的日期格式,因此请务必在您使用的任何解决方案中指定它。如果可能,让服务器以 ISO 格式发送日期。

d
digitalbath

在将字符串转换为 javascript 中的日期之前将“UTC”附加到字符串:

var date = new Date('6/29/2011 4:52:48 PM UTC');
date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"

函数 localizeDateStr (date_to_convert_str) { var date_to_convert = new Date(date_to_convert_str); var local_date = new Date(); date_to_convert.setHours(date_to_convert.getHours()+local_date.getTimezoneOffset());返回 date_to_convert.toString(); }
@matt offSet 返回分钟,而不是小时,您需要除以 60
这假设字符串的日期部分遵循美国标准 mm/dd/YYYY,这在欧洲和世界其他地区显然不是这样。
@digitalbath 适用于 Chrome,但不适用于 Firefox。
D
Dan Dascalescu

在我看来,服务器在一般情况下应始终以标准化的 ISO 8601 格式返回日期时间。

更多信息在这里:

http://www.w3.org/TR/NOTE-datetime

https://en.wikipedia.org/wiki/ISO_8601

在这种情况下,服务器将返回 '2011-06-29T16:52:48.000Z',它将直接馈送到 JS Date 对象中。

var utcDate = '2011-06-29T16:52:48.000Z';  // ISO-8601 formatted date returned from server
var localDate = new Date(utcDate);

localDate 将在正确的本地时间,在我的情况下是两个小时后(DK 时间)。

你真的不必做所有这些只会使事情复杂化的解析,只要你与服务器期望的格式一致。


如何获取iso格式日期?我正在以 UTC 格式获取日期,并在末尾附加 UTC
@Colin 这取决于语言。在 C# 中,您可以使用 .toString("o") 格式化 DateTime 对象,该对象返回 ISO-8601 格式的字符串,如上所示。 msdn.microsoft.com/en-us/library/zdtaw1bw(v=vs.110).aspx 在 javascript 中是 new Date().toISOString()developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
出于某种原因,将 UTC 附加到我的时间戳不起作用。但附加一个“z”确实如此。
@Chaster johnson,不错的收获。我正在使用 Python 的 datetime.isoformat() 将一些日期时间信息发送到我的 js 前端,并添加“Z”所有内容。检查 isoformat 源,他们没有添加“Z”的选项。我在 isoformat 输出的末尾手动添加了“Z”。 stackoverflow.com/questions/19654578/…
A
Adorjan Princz

这是一个通用的解决方案:

function convertUTCDateToLocalDate(date) {
    var newDate = new Date(date.getTime()+date.getTimezoneOffset()*60*1000);

    var offset = date.getTimezoneOffset() / 60;
    var hours = date.getHours();

    newDate.setHours(hours - offset);

    return newDate;   
}

用法:

var date = convertUTCDateToLocalDate(new Date(date_string_you_received));

根据客户端本地设置显示日期:

date.toLocaleString();

不适用于所有时区。 getTimeZoneOffset 以分钟为单位是有充分理由的! geographylists.com/list20d.html
@siukurnin。所以要管理奇怪的时区,请使用 newDate.setTime(date.getTime()+date.getTimezoneOffset()*60*1000)
newDate.setMinutes(date.getMinutes() - date.getTimezoneOffset()) 就足够了。在更正小时内
可以肯定,这不可能适用于 30 分钟后的任何时区?它似乎整整几个小时。
当时区偏移超过午夜时,这似乎也没有正确设置日期。可能是因为它只使用不影响日期的 setHours?
V
Vladimir M

对我来说,上述解决方案不起作用。

使用 IE 将 UTC 日期时间转换为本地有点棘手。对我来说,来自 Web API 的日期时间是 '2018-02-15T05:37:26.007',我想根据本地时区进行转换,所以我在 JavaScript 中使用了以下代码。

var createdDateTime = new Date('2018-02-15T05:37:26.007' + 'Z');

@Kumaresan,是的,它是最好的解决方案,即使评分低,也适用于 Firefox 和 Chromium
在 PostgreSQL 中使用 java 存储 DateTime 的最佳方法是什么?为了克服这个问题。请告诉我..
N
Nobita

您应该获得客户端的 (UTC) 偏移量(以分钟为单位):

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

然后对您从服务器获得的时间进行相应的加减运算。

希望这可以帮助。


夏令时呢?
M
Molp Burnbright

这对我有用:

function convertUTCDateToLocalDate(date) {
    var newDate = new Date(date.getTime() - date.getTimezoneOffset()*60*1000);
    return newDate;   
}

有效,并且比其他解决方案更简单。
B
Ben Bryant

将此功能放在您的脑海中:

<script type="text/javascript">
function localize(t)
{
  var d=new Date(t+" UTC");
  document.write(d.toString());
}
</script>

然后为页面正文中的每个日期生成以下内容:

<script type="text/javascript">localize("6/29/2011 4:52:48 PM");</script>

要删除 GMT 和时区,请更改以下行:

document.write(d.toString().replace(/GMT.*/g,""));

D
Daniel Tonon

这是基于 Adorjan Princ 的回答的简化解决方案:

function convertUTCDateToLocalDate(date) {
    var newDate = new Date(date);
    newDate.setMinutes(date.getMinutes() - date.getTimezoneOffset());
    return newDate;
}

或更简单(尽管它改变了原始日期):

function convertUTCDateToLocalDate(date) {
    date.setMinutes(date.getMinutes() - date.getTimezoneOffset());
    return date;
}

用法:

var date = convertUTCDateToLocalDate(new Date(date_string_you_received));

为什么这在 2017 年 10 月 9 日被否决?请写评论以帮助我理解您的意见。
为什么必须将日期转换为新日期两次?一次是在你调用函数时,第二次是在函数中?
@Sofia你是对的。这不是真的需要。我现在在 wschools 上玩了一下,简化版也可以。也许重复的 new Date(...) 来自调试。
我认为这是一个必要的黑客攻击,感谢您清除它:)
“更简单”的解决方案并不是更好的解决方案。它会改变原始日期。提供的第一个选项是您应该使用的选项。
U
Uniphonic

在尝试了其他一些在这里发布但没有好的结果之后,这似乎对我有用:

convertUTCDateToLocalDate: function (date) {
    return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(),  date.getHours(), date.getMinutes(), date.getSeconds()));
}

而这正好相反,从本地日期到 UTC:

convertLocalDatetoUTCDate: function(date){
    return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),  date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}

使用 new Date(+date + date.getTimezoneOffset() * 6e4) 的代码更少。 ;-)
它不起作用,我在 UTC 的时间是“2020-04-02T11:09:00”,所以从新加坡尝试了这个,新日期(+新日期(“2020-04-02T11:09:00”)+新日期( "2020-04-02T11:09:00").getTimezoneOffset() * 6e4) ,给出错误的时间
这行得通,新日期(“2020-04-02T11:09:00”+“Z”);
p
pabloa98

在末尾添加时区,在本例中为“UTC”:

theDate = new Date( Date.parse('6/29/2011 4:52:48 PM UTC'));

之后,使用 toLocale()* 函数族以正确的语言环境显示日期

theDate.toLocaleString();  // "6/29/2011, 9:52:48 AM"
theDate.toLocaleTimeString();  // "9:52:48 AM"
theDate.toLocaleDateString();  // "6/29/2011"

M
MaurGi

马特的回答缺少这样一个事实,即 Date() 和它需要转换的日期时间之间的夏令时可能不同 - 这是我的解决方案:

    function ConvertUTCTimeToLocalTime(UTCDateString)
    {
        var convertdLocalTime = new Date(UTCDateString);

        var hourOffset = convertdLocalTime.getTimezoneOffset() / 60;

        convertdLocalTime.setHours( convertdLocalTime.getHours() + hourOffset ); 

        return convertdLocalTime;
    }

调试器中的结果:

UTCDateString: "2014-02-26T00:00:00"
convertdLocalTime: Wed Feb 26 2014 00:00:00 GMT-0800 (Pacific Standard Time)

这是转换为本地时区,我们如何转换为特定时区而不加或减日期值?
M
Marzieh Mousavi

如果你有 2021-12-28T18:00:45.959Z 格式,你可以在 js 中使用它:

// myDateTime is 2021-12-28T18:00:45.959Z

myDate = new Date(myDateTime).toLocaleDateString('en-US');
// myDate is 12/28/2021

myTime = new Date(myDateTime).toLocaleTimeString('en-US');
// myTime is 9:30:45 PM

您只需输入您的区域字符串而不是“en-US”(例如“fa-IR”)。


a
adnan kamili

如果您不介意使用moment.js,并且您的时间是 UTC,请使用以下命令:

moment.utc('6/29/2011 4:52:48 PM').toDate();

如果您的时间不是UTC,而是您知道的任何其他语言环境,请使用以下内容:

moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY', 'fr').toDate();

如果您的时间已经在本地,请使用以下内容:

moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY');

M
Marzieh Mousavi

将此用于 UTC 和本地时间转换,反之亦然。

//Covert datetime by GMT offset 
//If toUTC is true then return UTC time other wise return local time
function convertLocalDateToUTCDate(date, toUTC) {
    date = new Date(date);
    //Local time converted to UTC
    console.log("Time: " + date);
    var localOffset = date.getTimezoneOffset() * 60000;
    var localTime = date.getTime();
    if (toUTC) {
        date = localTime + localOffset;
    } else {
        date = localTime - localOffset;
    }
    date = new Date(date);
    console.log("Converted time: " + date);
    return date;
}

夏令时发生了什么。中欧时区
m
mizuki nakeshu

对我来说最简单的似乎使用

datetime.setUTCHours(datetime.getHours());
datetime.setUTCMinutes(datetime.getMinutes());

(我认为第一行就足够了,但有些时区会在几小时内关闭)


有人对此有任何问题吗?这对我来说似乎是最好的选择。我取了一个结尾有“(UTC)”的 UTC 字符串,使用 new Date('date string') 将其设置为 Date 对象,然后添加了这两行,它似乎以完全基于时间的时间返回服务器的 UTC 时间戳,经过调整以使其与用户的本地时间相匹配。我也不得不担心奇怪的小时分时区......不确定它是否一直保持完美......
尝试了许多其他选项,但没有一个有效,但这有效
G
Gudradain

使用 YYYY-MM-DD hh:mm:ss 格式:

var date = new Date('2011-06-29T16:52:48+00:00');
date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"

要从 YYYY-MM-DD hh:mm:ss 格式转换,请确保您的日期遵循 ISO 8601 format

Year: 
    YYYY (eg 1997)    
Year and month: 
    YYYY-MM (eg 1997-07)
Complete date: 
    YYYY-MM-DD (eg 1997-07-16)
Complete date plus hours and minutes:
    YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)    
Complete date plus   hours, minutes and seconds:
    YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)    
Complete date plus hours, minutes, seconds and a decimal fraction of a second
    YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00) where:

YYYY = four-digit year
MM   = two-digit month (01=January, etc.)
DD   = two-digit day of month (01 through 31)
hh   = two digits of hour (00 through 23) (am/pm NOT allowed)
mm   = two digits of minute (00 through 59)
ss   = two digits of second (00 through 59)
s    = one or more digits representing a decimal fraction of a second
TZD  = time zone designator (Z or +hh:mm or -hh:mm)

需要注意的重要事项

您必须用 T 分隔日期和时间,空格在某些浏览器中不起作用您必须使用此格式设置时区 +hh:mm,使用字符串作为时区(例如:'UTC')将不起作用在许多浏览器中。 +hh:mm 表示与 UTC 时区的偏移量。


J
James Howey

JSON 日期字符串(在 C# 中序列化)看起来像“2015-10-13T18:58:17”。

在角度中,(在 Hulvej 之后)制作一个 localdate 过滤器:

myFilters.filter('localdate', function () {
    return function(input) {
        var date = new Date(input + '.000Z');
        return date;
    };
})

然后,显示当地时间,如:

{{order.createDate | localdate | date : 'MMM d, y h:mm a' }}

C
C.Lee

对我来说,这很好用

if (typeof date === "number") {
  time = new Date(date).toLocaleString();
  } else if (typeof date === "string"){
  time = new Date(`${date} UTC`).toLocaleString();
}

T
TLVF2627

这就是我将 UTC 转换为本地时间的方法:

const dataDate = '2020-09-15 07:08:08' const utcDate = new Date(dataDate); const myLocalDate = new Date(Date.UTC( utcDate.getFullYear(), utcDate.getMonth(), utcDate.getDate(), utcDate.getHours(), utcDate.getMinutes() )); document.getElementById("dataDate").innerHTML = dataDate; document.getElementById("myLocalDate").innerHTML = myLocalDate;

UTC

本地(GMT +7)

结果:2020 年 9 月 15 日星期二 14:08:00 GMT+0700(印度支那时间)。


你的变量名有错误......也许更好地将你的代码转换为代码片段,这样我们就可以运行和测试?
@Anton 谢谢你提醒我。我添加了代码片段并修复了我的代码。
N
Nisarg Desai

如果有人想要将转换时间显示到特定 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();
            }

我知道这个答案已经被接受了,但我到这里是因为谷歌,我确实从接受的答案中获得灵感来解决,所以我确实想在有人需要时分享它。


J
Joe

@Adorojan's 答案几乎是正确的。但是添加偏移量是不正确的,因为如果浏览器日期早于 GMT,偏移量值将是负数,反之亦然。以下是我提供的解决方案,对我来说效果很好:

// 输入 UTC 时间 var inputInUtc = "6/29/2011 4:52:48"; var dateInUtc = new Date(Date.parse(inputInUtc+" UTC")); //以UTC时间打印日期 document.write("UTC日期:" + dateInUtc.toISOString()+"
"); var dateInLocalTz = convertUtcToLocalTz(dateInUtc); //以当地时间打印日期 document.write("Date in Local : " + dateInLocalTz.toISOString()); function convertUtcToLocalTz(dateInUtc) { //转换为本地时区 return new Date(dateInUtc.getTime() - dateInUtc.getTimezoneOffset()*60*1000); }


M
Moriz

根据@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>

A
AConsumer

您可以使用 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 website


h
hamila firas

这对我来说很好用 safari/chrome/firefox :

const localDate = new Date(`${utcDate.replace(/-/g, '/')} UTC`);

S
SJMiller

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

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

这将通过偏移量适当地更新您的日期,因为它以分钟为单位。


T
ToniG

使用 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 文档。)


J
John Bell

我编写了一个不错的小脚本,它采用 UTC 纪元并将其转换为客户端系统时区,并以 d/m/YH:i:s(如 PHP 日期函数)格式返回:

getTimezoneDate = function ( e ) {

    function p(s) { return (s < 10) ? '0' + s : s; }        

    var t = new Date(0);
    t.setUTCSeconds(e);

    var d = p(t.getDate()), 
        m = p(t.getMonth()+1), 
        Y = p(t.getFullYear()),
        H = p(t.getHours()), 
        i = p(t.getMinutes()), 
        s = p(t.getSeconds());

    d =  [d, m, Y].join('/') + ' ' + [H, i, s].join(':');

    return d;

};

K
Klik

在 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 Date API


R
Rohit Parte

我创建了一个将所有时区转换为本地时间的函数。

我没有使用 getTimezoneOffset(),因为它没有返回正确的偏移值

要求:

1. npm i moment-timezone

function utcToLocal(utcdateTime, tz) {
    var zone = moment.tz(tz).format("Z") // Actual zone value e:g +5:30
    var zoneValue = zone.replace(/[^0-9: ]/g, "") // Zone value without + - chars
    var operator = zone && zone.split("") && zone.split("")[0] === "-" ? "-" : "+" // operator for addition subtraction
    var localDateTime
    var hours = zoneValue.split(":")[0]
    var minutes = zoneValue.split(":")[1]
    if (operator === "-") {
        localDateTime = moment(utcdateTime).subtract(hours, "hours").subtract(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
    } else if (operator) {
        localDateTime = moment(utcdateTime).add(hours, "hours").add(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
    } else {
        localDateTime = "Invalid Timezone Operator"
    }
    return localDateTime
}

utcToLocal("2019-11-14 07:15:37", "Asia/Kolkata")

//Returns "2019-11-14 12:45:37"

S
Suraj Galande

就我而言,我必须以秒为单位找出日期的差异。日期是 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;