UTC 날짜 시간을 현지 날짜 시간으로 변환


337

서버에서 다음 형식의 datetime 변수를 얻습니다 .UTC 6/29/2011 4:52:48 PM시간입니다. JavaScript를 사용하여 현재 사용자의 브라우저 시간으로 변환하고 싶습니다.

JavaScript 또는 jQuery를 사용하여 어떻게 수행 할 수 있습니까?



1
조심해. 이상한 날짜 형식이므로 사용하는 솔루션에 지정하십시오. 가능하면 서버가 날짜를 ISO 형식으로 보내도록하십시오.
Michael Scheper 2016 년

답변:


404

자바 스크립트에서 날짜로 변환하기 전에 문자열에 '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)"

5
localizeDateStr 함수 (date_to_convert_str) {var date_to_convert = 새 날짜 (date_to_convert_str); var local_date = 새 날짜 (); date_to_convert.setHours (date_to_convert.getHours () + local_date.getTimezoneOffset ()); 반환 날짜 _to_convert.toString (); }
matt

4
@matt offSet은 시간이 아닌 분을 반환하므로 60으로 나누어야합니다.
bladefist

50
이것은 문자열의 날짜 부분이 미국 표준 인 mm / dd / YYYY를 따르는 것으로 가정합니다. 이는 유럽과 세계의 다른 지역에서는 그렇지 않습니다.
AsGoodAsIt16

7
@digitalbath Chrome에서는 작동하지만 Firefox에서는 작동하지 않습니다.
Ganesh Satpute


138

필자의 관점에서 서버는 일반적으로 표준화 된 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내 경우에는 2 시간 후에 (DK 시간)이 될 것입니다 올바른 현지 시간에있을 것입니다.

당신은 정말 한 서버에서 기대하는 어떤 형식과 일치로, 모두에게 단지 물건을 복잡하게이 구문 분석 할 필요가 없습니다.


1
ISO 형식 날짜를 얻는 방법? 끝에 UTC가 추가 된 UTC 형식의 날짜가 표시됩니다.
Deepika

8
@Colin 언어에 따라 다릅니다. C #에서는 위와 같이 ISO-8601 형식의 문자열을 반환하는 DateTime개체를 형식화 할 수 있습니다 .toString("o"). msdn.microsoft.com/ko-kr/library/zdtaw1bw(v=vs.110).aspx 자바 스크립트는 new Date().toISOString()입니다. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Hulvej

99

이것은 보편적 인 해결책입니다.

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

41
모든 시간대에서 작동하지는 않습니다. getTimeZoneOffset이 몇 분 안에있는 좋은 이유가 있습니다! geographylists.com/list20d.html
siukurnin

5
@siukurnin. 이상한 시간대를 관리하려면 newDate.setTime (date.getTime () + date.getTimezoneOffset () * 60 * 1000)
Guillaume Gendre를 사용하십시오.

18
newDate.setMinutes (date.getMinutes ()-date.getTimezoneOffset ())이면 충분합니다. 시간 수정
Lu55

1
30 분이 지나는 시간대에서는 작동하지 않을 것이라고 확신하십니까? 전체 시간으로 반올림하는 것 같습니다.
NickG

2
또한 시간대 변경이 자정을 지나갈 때 날짜를 올바르게 설정하지 않는 것 같습니다. 아마도 날짜에 영향을 미치지 않는 setHours 만 사용하기 때문일까요?
Uniphonic

37

클라이언트의 (UTC) 오프셋 (분)을 가져와야합니다.

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

그런 다음 서버에서 얻은 시간에 해당하는 덧셈 또는 뺄셈을 수행하십시오.

도움이 되었기를 바랍니다.


2
DST는 어떻습니까?
Rich

26

나에게 위의 해결책은 효과가 없었다.

IE를 사용하면 UTC 날짜 / 시간을 로컬로 변환하는 것이 까다 롭지 않습니다. 나에게 웹 API의 날짜 시간은 '2018-02-15T05:37:26.007'현지 시간대별로 변환하고 싶으므로 JavaScript에서 아래 코드를 사용했습니다.

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

21

이 기능을 머리에 넣으십시오.

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

20

이것은 나를 위해 작동합니다 :

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

10

좋은 결과없이 여기에 게시 된 다른 몇 가지를 시도한 후에 이것은 효과가있는 것 같습니다.

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

1
사용할 코드가 적습니다 new Date(+date + date.getTimezoneOffset() * 6e4). ;-)
RobG

그것은 작동하지 않습니다, utc에서 내 시간은 "2020-04-02T11 : 09 : 00"이므로 싱가포르에서 시도했습니다, 새로운 날짜 (+ new Date ( "2020-04-02T11 : 09 : 00") + new Date ( "2020-04-02T11 : 09 : 00"). getTimezoneOffset () * 6e4), 잘못된 시간 제공
AhammadaliPK

이것은 새로운 Date ( "2020-04-02T11 : 09 : 00"+ 'Z');
AhammadaliPK

10

끝에 시간대를 추가하십시오 (이 경우 '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"

9

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)

9

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

3
일광 절약 시간에 일어난 일. CET 시간대
NovusMobile


9

이것은 Adorjan Princ의 답변을 바탕으로 한 단순화 된 솔루션입니다.

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

용법:

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

2017 년 10 월 9 일에 왜 이것이 하향 투표 되었습니까? 귀하의 의견을 이해하는 데 도움이되는 의견을 작성하십시오.
huha

9

사용에 신경 쓰지 않고 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');

5

나에게 가장 간단한 것은

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

(첫 번째 줄이면 충분하지만 몇 시간 만에 시간대가 있음을 알았습니다)


누구든지 이것에 문제가 있습니까? 이것은 나에게 가장 적합한 옵션 인 것 같습니다. 끝에 "(UTC)"가있는 UTC 문자열을 가져 와서을 사용하여 Date 객체로 설정 new Date('date string')한 다음이 두 줄을 추가하면 서버의 UTC 타임 스탬프에서 완전히 벗어난 시간으로 되돌아 오는 것처럼 보입니다. 사용자의 현지 시간과 일치하도록 조정했습니다. 나도 시간 단위의 이상한 분수에 대해 걱정할 필요가있다 ... 그것이 항상 완벽하게 유지되는지 확실하지 않다 ...
tylerl

시도 많은 다른 옵션은 그들 중 누구도 일했다, 그러나이 노력하고 있습니다
사 미라 K를

5

C #에서 직렬화 된 JSON 날짜 문자열은 "2015-10-13T18 : 58 : 17"과 같습니다.

각도에서 (Hulbej를 따라) 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' }}

3

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:mmUTC 시간대의 오프셋을 나타냅니다.

3

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


3

나를 위해, 이것은 잘 작동합니다

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

2

변환 된 시간을 특정 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();
            }

나는 대답이 이미 받아 들여 졌다는 것을 알고 있지만 나는 여기에 구글의 원인을 얻었고 나는 받아 들여진 대답에서 영감을 얻는 것으로 해결 했으므로 누군가가 필요하다면 그냥 공유하고 싶었다.


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>

0

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;

};

0

당신은 momentjs 를 사용할 수 있으며 , moment(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 웹 사이트를 참조하십시오


0

moment.js 파일을 사용하여 수행 할 수 있습니다 .

간단하게 시간대의 장소를 언급했습니다.

예 : 날짜 시간을 아시아 / 콜카타 시간대로 변환하려면 moment.js 에서 가져온 시간대 이름 만 언급하면 됩니다.

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


0

모든 시간대를 현지 시간으로 변환하는 하나의 함수를 만들었습니다.

적절한 오프셋 값을 반환하지 않기 때문에 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"

0

필자의 경우 날짜 차이를 초 단위로 찾아야했습니다. 날짜는 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
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;
}

방문하는 다른 사람들을 위해-이 함수를 사용하여 UTC 문자열에서 현지 날짜 개체를 얻으려면 DST를 처리하고 IE, IPhone 등에서 작동합니다.

우리는 문자열을 분할했습니다 (일부 브라우저에서는 JS 날짜 구문 분석이 지원되지 않기 때문에) UTC와 차이가 나는 UTC 시간에서 빼서 현지 시간을 제공합니다. 반환 된 오프셋은 DST로 계산되므로 (잘못된 경우 수정하십시오) 변수 "utc"에 해당 시간을 다시 설정합니다. 마지막으로 날짜 개체를 반환하십시오.


-1

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

각도 1.4.3 날짜 API

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.