簡體   English   中英

將 UTC 日期時間轉換為本地日期時間

[英]Convert UTC date time to local date time

我從服務器得到一個格式為: 6/29/2011 4:52:48 PM的日期時間變量,它是 UTC 時間。 我想使用 JavaScript 將其轉換為當前用戶的瀏覽器時區。

如何使用 JavaScript 或 jQuery 完成此操作?

Append 'UTC' 到字符串,然后將其轉換為 javascript 中的日期:

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

在我看來,服務器在一般情況下應該總是以標准化的 ISO 8601 格式返回日期時間。

更多信息在這里:

在這種情況下,服務器將返回'2011-06-29T16:52:48.000Z' ,它會直接輸入 JS 日期 object。

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

localDate將在正確的本地時間,在我的情況下將是兩個小時后(DK 時間)。

真的不必做所有這些只會使事情復雜化的解析,只要你與服務器期望的格式一致。

這是一個通用的解決方案:

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();

對我來說,上述解決方案不起作用。

使用 IE,將 UTC 日期時間轉換為本地時間有點棘手。 對我來說,web API 的日期時間是'2018-02-15T05:37:26.007' ,我想根據當地時區進行轉換,所以我在 JavaScript 中使用了以下代碼。

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

您應該獲得客戶端的 (UTC) 偏移量(以分鍾為單位):

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

然后對從服務器獲取的時間做相應的加減。

希望這可以幫助。

這對我有用:

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

把這個 function 記在你的腦子里:

<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,""));

這是基於 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));

在嘗試了這里發布的其他一些沒有好的結果之后,這似乎對我有用:

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

這適用於 go 相反的方式,從本地日期到 UTC:

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

在末尾添加時區,在本例中為“UTC”:

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

之后,使用toLocale ()* function 系列以正確的語言環境顯示日期

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

如果你有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”)。


您也可以使用toLocaleTimeString的選項,例如 { hour: '2-digit', minute: '2-digit' }

myTime = new Date(myDateTime).toLocaleTimeString('en-US',{ hour: '2-digit', minute: '2-digit' });
// myTime is 09:30 PM

有關toLocaleTimeStringtoLocaleDateString的更多信息

將此用於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;
}

Matt 的回答忽略了這樣一個事實,即 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)

如果你不介意使用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');

對我來說最簡單的似乎是使用

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

(我認為第一行就足夠了,但有些時區會在幾小時內關閉)

使用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 格式

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)

需要注意的重要事項

  1. 您必須用T分隔日期和時間,空格在某些瀏覽器中不起作用
  2. 您必須使用此格式設置時區+hh:mm ,使用字符串作為時區(例如:'UTC')在許多瀏覽器中不起作用。 +hh:mm表示與 UTC 時區的偏移量。

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

在 angular 中,(跟隨 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' }}

對我來說,這很好用

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

這就是我將 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;
 <p>UTC<p> <p id="dataDate"></p> <p>Local(GMT +7)<p> <p id="myLocalDate"></p>

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

我回答這個如果有人想要 function 將轉換后的時間顯示到特定的 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();
            }

我知道答案已經被接受,但我來到這里是因為谷歌,我確實通過從接受的答案中獲得靈感來解決問題,所以我確實想在有人需要的時候分享它。

@Adorojan's回答幾乎是正確的。 但是添加偏移量是不正確的,因為如果瀏覽器日期早於 GMT,偏移量值將為負,反之亦然。 以下是我提供的解決方案,對我來說工作得很好:

 // Input time in UTC var inputInUtc = "6/29/2011 4:52:48"; var dateInUtc = new Date(Date.parse(inputInUtc+" UTC")); //Print date in UTC time document.write("Date in UTC: " + dateInUtc.toISOString()+"<br>"); var dateInLocalTz = convertUtcToLocalTz(dateInUtc); //Print date in local time document.write("Date in Local: " + dateInLocalTz.toISOString()); function convertUtcToLocalTz(dateInUtc) { //Convert to local timezone return new Date(dateInUtc.getTime() - dateInUtc.getTimezoneOffset()*60*1000); }

基於@digitalbath 的回答,這里有一個小的 function 來獲取 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>

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

這對我來說很適合 safari/chrome/firefox:

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

我相信這是最好的解決方案:

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

這將通過偏移量適當地更新您的日期,因為它以分鍾為單位顯示。

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

源字符串必須指定時區或 UTC。

單線:

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

結果出現在我的 web 瀏覽器之一中:

"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)"

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

這對我有用

選項 1:如果日期格式類似於“yyyy-mm-dd”或“yyyy-mm-dd H:n:s”,例如:“2021-12-16 06:07:40”

使用這種格式,它真的不知道它是本地格式還是 UTC 時間。 因此,由於我們知道日期是 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。 大多數服務器 timestampz 格式采用 ISO-8601,例如:'2011-06-29T16:52:48.000Z'。 這樣我們就可以將它傳遞給日期 function 和 toLocaleString() function。

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

在 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

我寫了一個不錯的小腳本,它采用 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;

};

我創建了一個 function 將所有時區轉換為本地時間。

我沒有使用 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"

就我而言,我必須找出以秒為單位的日期差異。 日期是 UTC 日期字符串,因此我將其轉換為本地日期 object。這就是我所做的:

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;

UTC 到本地到 ISO - 使用 Molp Burnbright 答案

因為服務器只接受 ISO 日期時間所以我將 UTC 轉換為本地時區並以 ISO 格式將其發送到服務器

在某處聲明

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

並在需要 ISO 格式的本地日期時間的地方執行此操作convertUTCDateToLocalDate(date).toISOString()

我遇到了類似的問題,我使用以下代碼(JavaScript)將 UTC 轉換為本地時間

 let a = new Date() a = a.getFullYear().toString() + "-" + (a.getMonth() + 1).toString().padStart(2, "0") + "-" + a.getDate().toString().padStart(2, "0") console.log(a)

在 JavaScript 中,我使用了:

var updaated_time= "2022-10-25T06:47:42.000Z"

{{updaated_time | date: 'dd-MM-yyyy HH:mm'}} //output: 26-10-2022 12:00
function getUTC(str) {
    var arr = str.split(/[- :]/);
    var utc = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
    utc.setTime(utc.getTime() - utc.getTimezoneOffset()*60*1000)
    return utc;
}

對於訪問的其他人 - 使用此 function 從 UTC 字符串中獲取本地日期 object,應該注意 DST 並將在 IE、iPhone 等上工作。

我們拆分字符串(因為某些瀏覽器不支持 JS 日期解析)我們從 UTC 中獲取差異並從 UTC 時間中減去它,這給了我們本地時間。 由於返回的偏移量是用 DST 計算的(如果我錯了請糾正我),所以它會將那個時間設置回變量“utc”。 最后返回日期object。

您可以使用moment.js文件完成它。

很簡單,您剛剛提到了時區的位置。

示例:如果您要將日期時間轉換為 Asia/Kolkata 時區,則只需提及從moment.js獲得的時區名稱

 var UTCDateTime="Your date obtained from UTC"; var ISTleadTime=(moment.tz(UTCDateTime, "Africa/Abidjan")).tz("Asia/Kolkata").format('YYYY-MM-DD LT');

對於 TypeScript 用戶,這里有一個助手 function:

// Typescript Type: Date Options
interface DateOptions {
  day: 'numeric' | 'short' | 'long',
  month: 'numeric',
  year: 'numeric',
  timeZone: 'UTC',
};

// Helper Function: Convert UTC Date To Local Date
export const convertUTCDateToLocalDate = (date: Date) => {
  // Date Options
  const dateOptions: DateOptions = {
    day: 'numeric',
    month: 'numeric',
    year: 'numeric',
    timeZone: 'UTC',
  };

  // Formatted Date (4/20/2020)
  const formattedDate = new Date(date.getTime() - date.getTimezoneOffset() * 60 * 1000).toLocaleString('en-US', dateOptions);
  return formattedDate;
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM