UTC Epoch를 현지 날짜로 변환


273

나는 지금 이것과 조금 싸워왔다. 에포크를 날짜 객체로 변환하려고합니다. 신기원은 UTC로 나에게 보내진다. new Date()에포크 를 통과 할 때마다 로컬 에포크라고 가정합니다. UTC 객체를 만든 다음 setTime()적절한 시대로 조정하는 데 사용 했지만 유용한 유일한 방법은 toUTCString()문자열이며 도움이되지 않습니다. 해당 문자열을 새로운 날짜로 전달하면 UTC라는 것을 알 수 있지만 그렇지 않습니다.

new Date( new Date().toUTCString() ).toLocaleString()

다음 시도는 로컬 현재 시대와 UTC 현재 시대 사이의 차이를 얻으려고 시도했지만 그중 하나도 얻을 수 없었습니다.

new Date( new Date().toUTCString() ).getTime() - new Date().getTime()

1000 미만의 작은 차이 만 밀리 초 단위입니다.

어떤 제안?


11
에포크 시간은 1970 년 날짜 이후 경과 된 밀리 초 ( UTC) 로 정의됩니다 . 지역 시대와 같은 것은 없습니다! 귀하의 문제를 이해하지 못했습니다.
Chetan Sastry 2012 년

컴퓨터의 시간대가 정확하지 않아 다른 UTC 값으로 연결될 수 있습니까?
kijin

2
toLocaleString ()을 사용할 때 UTC 시간을 '보려면'시계를 UTC 시간으로 설정해야합니다. 자정 UTC는 동부 표준시 오후 7시입니다. localeString 대신 new Date (). toString ()을 사용하면 'Fri Jan 07 2011 07:00:00 GMT-0500'과 같은 오프셋이 포함됩니다.
kennebec

답변:


465

더 간단한 해결책이 있다고 생각합니다. 초기 날짜를 시대로 설정하고 UTC 단위를 추가하십시오. UTC 에포크 var가 초 단위로 저장되어 있다고 가정 해보십시오. 어때요 1234567890? 현지 시간대로 적절한 날짜로 변환하려면 다음을 수행하십시오.

var utcSeconds = 1234567890;
var d = new Date(0); // The 0 there is the key, which sets the date to the epoch
d.setUTCSeconds(utcSeconds);

d 이제는 내 시간대의 날짜로 설정되었습니다. Fri Feb 13 2009 18:31:30 GMT-0500 (EST)


190
FWIW, Date 객체는 밀리 초로 초기화 할 수 있습니다. 따라서 var d = new Date(utcSeconds * 1000)동일한 결과를 얻을 수 있습니다.
kurttheviking

54
var d = new Date(1234567890000)같은 결과를 반환
Matjaz Lipus

11
다른 사람들이 몇 가지 점에서 명확성을 얻을 수 있다고 생각했습니다. 날짜 개체가 "스탬프 된"시간대로 설정되지 않았습니다. 숫자로만 생각하십시오. 이 숫자는 1970 년 1 월 1 일 UTC 이후 (현재 UTC) 현재 밀리 초입니다. 따라서 날짜 객체를 만들 때마다 실제로 장면 뒤의 UTC입니다. 2. 해당 날짜를 표시하려면 날짜를 로케일 설정 (toLocaleString () 또는 UTC (toUTCString ()))으로 표시 할 수 있습니다. 직접 변환 할 필요는 없습니다. 문자열 - 너무 오랫동안이 지역의 시간대에의한다.
다 비히

2
1234567890000은 Y39K 문제로 알려진 1234567890과 동일하게 처리됩니다.
muttonUp

1
@ muttonUp, 1000 mullitplication으로 효과가있었습니다. 그러나, 'Y39K 문제 "구글은 유효한 결과를 제공하지 않는 모든 URL 도움이 될 것입니다.
P 사티 Patro

238

간단합니다 new Date(). 예를 들어 밀리 초가 걸립니다.

new Date(1394104654000)
> Thu Mar 06 2014 06:17:34 GMT-0500 (EST)

6
좋은 것! 이것은 실제로 받아 들여지는 대답으로 간주되어야합니다.
Nizar B.

이것은 나를 위해 일을하지 않았다, 당신이 타임 스탬프를 가지고 있지만 UTC 시대에 수동으로 설정 utcseconds에있을 때 답변을 받아 정답되어 작동합니다
sameerali

12
이것은 적절한 답변입니다. 새로운 날짜는 밀리 초가 걸릴 수 있으므로 1000을 곱하면됩니다 : const d = new Date(epoch * 1000).
vinyll

@sameerali 아마도 시스템에 다른 문제가 있었거나 혼란 스러웠을 것입니다. 이 답변은 정답입니다. 유닉스 시대의 정의 : 초 수는 1월 1일 자정 UTC 이후 경과 . 경과 된 밀리 초 수를 얻으려면 1000을 곱하십시오.
nalply

32

그리고 로그의 경우 포맷을 위해 사용했던 Moment.js 라이브러리를 사용 하여이 작업을 수행 했습니다.

moment.utc(1234567890000).local()
>Fri Feb 13 2009 19:01:30 GMT-0430 (VET)

1
순간은 좋지만 1.3MB 라이브러리를 사용하여 하나의 시대를 날짜로 변환하는 것은 미친 짓입니다. 거기에 너무 많은 부풀린 노드 앱이 있다는 것은 놀라운 일이 아닙니다.
not2qubit

20

에포크 시간에 1970 년 1 월 1 일에서 date.getTime()반환 밀리 초 당신은 시대의 타임 스탬프가있는 경우, 1000 곱하여 자바 스크립트 타임 스탬프로 변환 ... 그래서, 1 월 1 일 1970.

   function epochToJsDate(ts){
        // ts = epoch timestamp
        // returns date obj
        return new Date(ts*1000);
   }

   function jsDateToEpoch(d){
        // d = javascript date obj
        // returns epoch timestamp
        return (d.getTime()-d.getMilliseconds())/1000;
   }

지구상에서 무슨 일이 있었는지 궁금했습니다. 날짜 구문 분석과 관련하여 epochTime! == javascriptTime 이라는 것을 아는 것이 좋습니다 . 감사!
GrayedFox

16
 function ToLocalDate (inDate) {
    var date = new Date();
    date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
    return date;
}

1
당신은 내 하루를 만들었습니다. TY. 방금 빼기 기호를 내 작업의 더하기 기호로 바꿨습니다.
Ludovic Kuty

5

[ms]의 현재 에포크 시간을 24 시간으로 변환합니다. 12 시간 형식 을 비활성화 하려면 옵션을 지정해야 할 수도 있습니다 .

$ node.exe -e "var date = new Date(Date.now()); console.log(date.toLocaleString('en-GB', { hour12:false } ));"

2/7/2018, 19:35:24

또는 JS로 :

var date = new Date(Date.now()); 
console.log(date.toLocaleString('en-GB', { hour12:false } ));
// 2/7/2018, 19:35:24

console.log(date.toLocaleString('en-GB', { hour:'numeric', minute:'numeric', second:'numeric', hour12:false } ));
// 19:35:24

참고 : 사용 en-GB여기가, 24 시간 형식을 사용하여 장소의 단지 (랜덤) 선택, 그것은 시간대 아니다!


1
이것은 Date 메서드에서 모든 유형의 변환을 얻는 가장 좋은 방법입니다. 감사!
SeaWarrior404

나는 위의와 같이하지 않는 유일한 것은, 그것의 그 모호한 형식으로 날짜를 반환한다는 것입니다 d/m/yyyy또는 그것이 m/d/yyyy? 이것을 표시하는 가장 올바른 방법은 다음과 같아야합니다 yyyy-mm-dd. 응시자?
not2qubit

4

에포크 시간 (즉, 유닉스 에포크 시간) 거의 항상의 수 1970년 1월 1일 0시 0분 0초 (UTC 시간)부터 만료,하지의 수 밀리 초 여기에 몇 가지 답변을 암시했다.

https://ko.wikipedia.org/wiki/Unix_time

따라서 Unix Epoch 시간 값이 주어지면 아마도 초 단위가 될 것이며, 다음과 같이 보일 것 1547035195입니다. 이 사람을 JavaScript로 읽을 수있게하려면 값을 밀리 초로 변환하고 해당 값을 Date(value)생성자에 전달해야합니다 . 예 :

const unixEpochTimeMS = 1547035195 * 1000;
const d = new Date(unixEpochTimeMS);
// Careful, the string output here can vary by implementation...
const strDate = d.toLocaleString();

d.setUTCMilliseconds(0)JavaScript Date(value)생성자는 현지 시간이 아닌 밀리 초 단위 로 UTC 값을 사용 하므로 허용 된 답변 의 단계 를 수행 할 필요가 없습니다 .

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Syntax

또한 Date(...)문자열 날짜 시간 표현을 사용하는 생성자를 사용 하지 않아야합니다 (권장되지 않음).


3

UTC 문자열을 "로컬"문자열로 변환하도록 요청하고 있습니까? 당신은 할 수 있습니다 :

var utc_string = '2011-09-05 20:05:15';
var local_string = (function(dtstr) {
    var t0 = new Date(dtstr);
    var t1 = Date.parse(t0.toUTCString().replace('GMT', ''));
    var t2 = (2 * t0) - t1;
    return new Date(t2).toString();
})(utc_string);

3

@djechlin의 위 답변에 추가

d = '1394104654000';
new Date(parseInt(d));

EPOCH 시간을 사람이 읽을 수있는 날짜로 변환합니다. EPOCH 시간 유형은 정수 여야한다는 것을 잊지 마십시오.


3

내가 찾은 가장 간단한 해결책은 다음과 같습니다.

var timestamp = Date.now(), // returns milliseconds since epoch time
    normalisedTime = new Date(timestamp);

이것은 (어쨌든 나를 위해!) 항상 잘못된 날짜를주는 것처럼 보이기 때문에 진술 * 1000의 끝에는 없습니다 new Date(timestamp).


2

moment.js와 같은 라이브러리없이 UTC 및 현지 시간으로 시간 소인 및 날짜 변환을 해결하려는 경우 아래 옵션을 살펴보십시오.

UTC 타임 스탬프를 사용하는 응용 프로그램의 경우 현지 시간대와 일광 절약 시간을 고려하여 브라우저에 날짜를 표시해야 할 수 있습니다. 동일한 시간대에 있어도 일광 절약 시간이 다른 날짜를 편집하는 것은 까다로울 수 있습니다.

아래 의 NumberDate확장을 사용하면 타임 스탬프의 시간대로 날짜를 표시하고 가져올 수 있습니다. 예를 들어, 7 월 또는 12 월에 날짜를 편집하는 경우 밴쿠버에 있다고 가정하면 PST 또는 PDT로 날짜를 편집하고 있음을 의미 할 수 있습니다.

이 솔루션을 테스트하려면 아래의 코드 스 니펫을 확인하는 것이 좋습니다.

밀리 초에서 변환

Number.prototype.toLocalDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() + (value.getTimezoneOffset() / 60));

    return value;
};

Number.prototype.toUTCDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() - (value.getTimezoneOffset() / 60));

    return value;
};

날짜로부터의 전환

Date.prototype.getUTCTime = function () {
    return this.getTime() - (this.getTimezoneOffset() * 60000);
};

용법

// Adds the timezone and daylight savings if applicable
(1499670000000).toLocalDate();

// Eliminates the timezone and daylight savings if applicable
new Date(2017, 6, 10).getUTCTime();

직접보십시오


이것이 실제 답변입니다. 나를 위해 매력처럼 일했습니다. 새로운 날짜 (0) 설정 및 밀리 초를 추가하는 새로운 날짜 (밀리 초)과 동일
Jersey_Guy

1

편집하다

var utcDate = new Date(incomingUTCepoch);
var date = new Date();
date.setUTCDate(utcDate.getDate());
date.setUTCHours(utcDate.getHours());
date.setUTCMonth(utcDate.getMonth());
date.setUTCMinutes(utcDate.getMinutes());
date.setUTCSeconds(utcDate.getSeconds());
date.setUTCMilliseconds(utcDate.getMilliseconds());

수정 수정


나는 두 번째 예에서 이것을 겪었다. 그것이 제공하는 차이는 50에서 900 사이이며, 밀리 초 단위입니다 (실제 차이가 아닌 계산 처리 시간 표시)
Shane Reustle

그들 중 누구도 나를 도와주지 않습니다. 그들은 완벽 할 것 setUTCTime 방법을 누락 : P의 w3schools.com/jsref/jsref_obj_date.asp을
셰인 Reustle

적어도 우분투 용 Firefox에서는 작동하지 않습니다. 코드는 날짜를 설정 한 후 일 / 월 / 년을 설정해서는 안됩니다.
사이먼 코즐 로프

@Simon Kozlov 실제로 날짜 개체에 잘못된 가정이 있습니다 .setDate 및 getDate는 해당 월의 일을 참조하며 문제는 존재하지 않는 (setUTCDay)와 같은 함수를 사용한다는 것입니다.
Amjad Masad

@AmjadMasad 예상 출력도 표시하면 답변이 더 도움이됩니다.
not2qubit

0

고려해 epoch_time볼 때,

// for eg. epoch_time = 1487086694.213
var date = new Date(epoch_time * 1000); // multiply by 1000 for milliseconds
var date_string = date.toLocaleString('en-GB');  // 24 hour format


0

@Amjad, 좋은 생각이지만 더 나은 구현은 다음과 같습니다.

Date.prototype.setUTCTime = function(UTCTimestamp) {
    var UTCDate = new Date(UTCTimestamp);
    this.setUTCFullYear(UTCDate.getFullYear(), UTCDate.getMonth(), UTCDate.getDate());
    this.setUTCHours(UTCDate.getHours(), UTCDate.getMinutes(), UTCDate.getSeconds(), UTCDate.getMilliseconds());
    return this.getTime();
}

-1

먼저 문자열로 변환 한 다음 시간대 텍스트를 바꾸십시오.

function convertUnixTime(time) {
  return new Date(time*1000).toString().replace("GMT+0530 (Sri Lanka Standard Time)","");
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.