Chuyển đổi thời gian ngày UTC sang giờ ngày địa phương


336

Từ máy chủ, tôi nhận được một biến datetime theo định dạng này: 6/29/2011 4:52:48 PMvà đó là thời gian UTC. Tôi muốn chuyển đổi nó sang thời gian trình duyệt hiện tại của người dùng bằng JavaScript.

Làm thế nào điều này có thể được thực hiện bằng cách sử dụng JavaScript hoặc jQuery?



1
Hãy cẩn thận. Đó là một định dạng ngày kỳ lạ, vì vậy hãy chắc chắn chỉ định nó trong bất kỳ giải pháp nào bạn sử dụng. Nếu có thể, hãy nhờ máy chủ gửi ngày ở định dạng ISO.
Michael Scheper

Câu trả lời:


402

Nối 'UTC' vào chuỗi trước khi chuyển đổi nó thành một ngày trong 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)"

5
chức năng localizeDateStr (date_to_convert_str) {var date_to_convert = ngày mới (date_to_convert_str); var local_date = ngày mới (); date_to_convert.setHours (date_to_convert.getHours () + local_date.getTimezone Offerset ()); trả về date_to_convert.toString (); }
matt

4
@matt off Set trả về số phút, không phải giờ, bạn cần chia cho 60
bladefist

50
Điều này giả định rằng phần ngày của chuỗi tuân theo tiêu chuẩn Hoa Kỳ, mm / dd / YYYY, không rõ ràng là trường hợp ở châu Âu và các nơi khác trên thế giới.
AsoodAsItGets 14/1/2015

7
@digitalbath Hoạt động trên Chrome nhưng không hoạt động trên Firefox.
Ganesh Satpute


137

Theo quan điểm của tôi, các máy chủ phải luôn luôn trong trường hợp chung trả về một datetime theo định dạng ISO 8601 được tiêu chuẩn hóa .

Thêm thông tin ở đây:

Trong trường hợp này, máy chủ sẽ trả về '2011-06-29T16:52:48.000Z'sẽ cung cấp trực tiếp vào đối tượng Ngày JS.

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

Các localDate sẽ được trong thời gian địa phương ngay mà trong trường hợp của tôi sẽ là hai giờ sau đó (thời gian DK).

Bạn thực sự không phải thực hiện tất cả các phân tích cú pháp này mà chỉ làm phức tạp công cụ, miễn là bạn phù hợp với định dạng mong đợi từ máy chủ.


1
Làm thế nào để có được ngày định dạng iso? tôi sắp có ngày ở định dạng UTC với UTC được nối đến hết
Deepika

8
@Colin đó là ngôn ngữ phụ thuộc. Trong C #, bạn có thể định dạng một DateTimeđối tượng .toString("o")trả về chuỗi được định dạng ISO-8601 như được hiển thị ở trên. msdn.microsoft.com/en-us/l Library / zdtaw1bw (v = vs.110) .aspx Trong javascript đó new Date().toISOString(). developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
Khăn

98

Đây là một giải pháp phổ quát:

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;   
}

Sử dụng:

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

Hiển thị ngày dựa trên cài đặt cục bộ của máy khách:

date.toLocaleString();

41
Không hoạt động với tất cả các múi giờ. Có một lý do chính đáng tại sao getTimeZone Offerset chỉ trong vài phút! geographylists.com/list20d.html
siukurnin

5
@siukurnin. vì vậy để quản lý múi giờ kỳ lạ, hãy sử dụng newDate.setTime (date.getTime () + date.getTimezone Offerset () * 60 * 1000)
Guillaume Gendre

18
newDate.setMinutes (date.getMinutes () - date.getTimezone Offerset ()) là đủ. Trong giờ sửa cũng là tốt
Lu55

1
Khá chắc chắn điều này không thể làm việc cho bất kỳ múi giờ nào ngoài 30 phút? Nó dường như làm tròn đến cả giờ.
NickG

2
Điều này dường như cũng không đặt đúng ngày khi sự thay đổi múi giờ vượt qua nửa đêm; có thể bởi vì nó chỉ sử dụng setHours mà không ảnh hưởng đến ngày?
Uniphonic

37

Bạn sẽ nhận được phần bù (UTC) (tính bằng phút) của máy khách:

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

Và sau đó thực hiện việc thêm hoặc bổ sung tương ứng với thời gian bạn nhận được từ máy chủ.

Hi vọng điêu nay co ich.


2
Còn DST thì sao?
Giàu

26

Đối với tôi các giải pháp trên không hoạt động.

Với IE, việc chuyển đổi thời gian ngày UTC sang cục bộ hơi khó khăn. Đối với tôi, thời gian ngày từ API web là '2018-02-15T05:37:26.007'và tôi muốn chuyển đổi theo múi giờ địa phương nên tôi đã sử dụng mã bên dưới trong JavaScript.

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

21

Đặt chức năng này trong đầu của bạn:

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

Sau đó tạo các mục sau cho mỗi ngày trong phần thân trang của bạn:

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

Để xóa GMT và múi giờ, thay đổi dòng sau:

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

20

Điều này làm việc cho tôi:

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

10

Sau khi thử một vài người khác đăng ở đây mà không có kết quả tốt, điều này dường như có hiệu quả với tôi:

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

Và điều này hoạt động theo cách ngược lại, từ Ngày địa phương đến UTC:

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

1
Ít mã để sử dụng new Date(+date + date.getTimezoneOffset() * 6e4). ;-)
RobG

nó không hoạt động, thời gian của tôi trong utc là "2020-04-02T11: 09: 00", vì vậy đã thử điều này từ Singapore, Ngày mới (+ Ngày mới ("2020-04-02T11: 09: 00") + Ngày mới ( "2020-04-02T11: 09: 00"). GetTimezone Offerset () * 6e4), đưa ra thời gian sai
AhammadaliPK

cái này hoạt động, ngày mới ("2020-04-02T11: 09: 00" + 'Z');
AhammadaliPK

10

Thêm múi giờ ở cuối, trong trường hợp này là 'UTC':

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

sau đó, sử dụng các họ hàm toLocale () * để hiển thị ngày theo đúng miền

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

9

Câu trả lời của Matt thiếu thực tế là thời gian tiết kiệm ánh sáng ban ngày có thể khác nhau giữa Ngày () và thời gian ngày cần chuyển đổi - đây là giải pháp của tôi:

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

        var hourOffset = convertdLocalTime.getTimezoneOffset() / 60;

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

        return convertdLocalTime;
    }

Và kết quả trong trình gỡ lỗi:

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

9

Sử dụng công cụ này để chuyển đổi UTC và giờ địa phương và ngược lại.

//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;
}

3
những gì đã xảy ra tại thời điểm tiết kiệm ánh sáng ban ngày. Múi giờ CET
NovusMobile

xem câu trả lời của tôi @ stackoverflow.com/questions/6525538/ từ
Hulvej

9

Đây là một giải pháp đơn giản dựa trên câu trả lời của Adorjan Princ Liệu:

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

Sử dụng:

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

Tại sao điều này bị hạ cấp vào ngày 9 tháng 10 năm 2017? Hãy viết bình luận để giúp tôi hiểu ý kiến ​​của bạn.
huha

9

Trong trường hợp bạn không phiền khi sử dụng moment.jsvà thời gian của bạn ở UTC, chỉ cần sử dụng như sau:

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

nếu thời gian của bạn không ở utc mà là bất kỳ miền địa phương nào bạn biết, thì hãy sử dụng như sau:

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

nếu thời gian của bạn đã ở địa phương, thì hãy sử dụng như sau:

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

5

Đối với tôi đơn giản nhất dường như sử dụng

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

(tôi nghĩ dòng đầu tiên có thể là đủ nhưng có những múi giờ tắt theo phân số giờ)


Có ai có bất kỳ vấn đề với điều này? Đây dường như là lựa chọn tốt nhất cho tôi. Tôi đã lấy một chuỗi UTC có "(UTC)" ở cuối chuỗi, thiết lập nó làm đối tượng Date bằng cách sử dụng new Date('date string'), sau đó thêm hai dòng này và nó dường như quay trở lại với thời gian hoàn toàn tắt dấu thời gian UTC của máy chủ với các điều chỉnh được thực hiện để làm cho nó phù hợp với giờ địa phương của người dùng. Tôi cũng phải lo lắng về các múi giờ kỳ lạ trong một giờ ... Không chắc nó có giữ hoàn hảo mọi lúc không ...
tylerl

đã thử nhiều lựa chọn khác, không có lựa chọn nào trong số chúng hoạt động, nhưng điều này đang hoạt động
Sameera K

5

Chuỗi ngày JSON (được tuần tự hóa trong C #) trông giống như "2015-10-13T18: 58: 17".

Trong góc, (theo Hulvej) tạo localdatebộ lọc:

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

Sau đó, hiển thị giờ địa phương như:

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

3

Sử dụng YYYY-MM-DD hh:mm:ssđịnh dạng:

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

Để chuyển đổi từ YYYY-MM-DD hh:mm:ssđịnh dạng, đảm bảo ngày của bạn tuân theo định dạng 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)

Những điều quan trọng cần lưu ý

  1. Bạn phải phân tách ngày và thời gian bằng một T, một không gian sẽ không hoạt động trong một số trình duyệt
  2. Bạn phải đặt múi giờ bằng định dạng này +hh:mm, sử dụng chuỗi cho múi giờ (ví dụ: 'UTC') sẽ không hoạt động trong nhiều trình duyệt. +hh:mmđại diện cho phần bù từ múi giờ UTC.

3

@Adorojan'sCâu trả lời gần như đúng. Nhưng việc bổ sung offset là không chính xác vì giá trị offset sẽ âm nếu ngày trình duyệt đi trước GMT và ngược lại. Dưới đây là giải pháp mà tôi đi kèm và đang hoạt động hoàn toàn tốt cho tôi:

// 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);
}


3

Đối với tôi, điều này hoạt động tốt

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

2

Tôi trả lời điều này Nếu bất kỳ ai muốn chức năng hiển thị thời gian đã chuyển đổi thành phần tử id cụ thể và áp dụng chuỗi định dạng ngày yyyy-mm-dd ở đây date1 là chuỗi và id là id của phần tử mà thời gian sẽ hiển thị.

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

Tôi biết rằng câu trả lời đã được chấp nhận nhưng tôi đến đây vì google và tôi đã giải quyết bằng cách lấy cảm hứng từ câu trả lời được chấp nhận vì vậy tôi chỉ muốn chia sẻ nó nếu ai đó cần.


1

Dựa trên câu trả lời @digitalbath, đây là một hàm nhỏ để lấy dấu thời gian UTC và hiển thị thời gian cục bộ trong một phần tử DOM đã cho (sử dụng jQuery cho phần cuối cùng này):

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>

0

Tôi đã viết một tập lệnh nhỏ đẹp lấy một epoch UTC và chuyển đổi nó theo múi giờ của hệ thống máy khách và trả về nó ở định dạng d / m / YH: i: s (như hàm ngày 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;

};

0

Bạn có thể sử dụng khoảnh khắc , moment(date).format()sẽ luôn đưa ra kết quả vào ngày địa phương .

Tiền thưởng , bạn có thể định dạng theo bất kỳ cách nào bạn muốn. Ví dụ.

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

Để biết thêm chi tiết, bạn có thể tham khảo trang web của Moment js


0

Bạn có thể hoàn thành nó bằng cách sử dụng tệp Moment.js .

Nó đơn giản, bạn vừa đề cập đến vị trí của múi giờ.

Ví dụ: Nếu bạn chuyển đổi datetime của mình sang múi giờ châu Á / Kolkata, bạn chỉ cần đề cập đến tên của địa điểm múi giờ thu được từ khoảnh khắc.js

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


0

Tôi đã tạo một chức năng chuyển đổi tất cả các múi giờ thành giờ địa phương.

Tôi đã không sử dụng getTimezone Offerset (), vì nó không trả về giá trị bù thích hợp

Yêu cầu:

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"

0

Trong trường hợp của tôi, tôi đã phải tìm sự khác biệt của ngày tính bằng giây. Ngày là một chuỗi ngày UTC, vì vậy tôi đã chuyển đổi nó thành một đối tượng ngày địa phương. Đây là những gì tôi đã làm:

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
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;
}

Đối với những người khác truy cập - sử dụng chức năng này để lấy đối tượng ngày cục bộ từ chuỗi UTC, nên chăm sóc DST và sẽ hoạt động trên IE, IPhone, v.v.

Chúng tôi chia chuỗi (Vì phân tích ngày JS không được hỗ trợ trên một số trình duyệt) Chúng tôi nhận được sự khác biệt so với UTC và trừ nó khỏi thời gian UTC, điều này mang lại cho chúng tôi giờ địa phương. Vì phần bù được trả về được tính bằng DST (sửa tôi nếu tôi sai), do đó, nó sẽ đặt thời gian đó trở lại trong biến "utc". Cuối cùng trả về đối tượng ngày.


-1

Trong Angular tôi đã sử dụng câu trả lời của Ben theo cách này:

$scope.convert = function (thedate) {
    var tempstr = thedate.toString();
    var newstr = tempstr.toString().replace(/GMT.*/g, "");
    newstr = newstr + " UTC";
    return new Date(newstr);
};

Chỉnh sửa: Angular 1.3.0 đã thêm hỗ trợ UTC vào bộ lọc ngày, tôi chưa sử dụng nhưng nó sẽ dễ dàng hơn, đây là định dạng:

{{ date_expression | date : format : timezone}}

API ngày 1.4.3 góc

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.