JavaScript에서 UTC 타임 스탬프를 어떻게 얻습니까?


157

웹 애플리케이션을 작성하는 동안 DB에 모든 날짜 시간을 UTC 타임 스탬프 로 저장 (서버 측)하는 것이 좋습니다.

JavaScript의 시간대 조작 측면에서 많은 것을 할 수 없다는 것을 알았을 때 놀랐습니다.

Date 객체를 약간 확장했습니다. 이 기능이 의미가 있습니까? 기본적으로 서버에 무엇이든 보낼 때 마다이 기능으로 포맷 된 타임 스탬프가됩니다 ...

여기에 큰 문제가 있습니까? 아니면 다른 각도의 솔루션입니까?

Date.prototype.getUTCTime = function(){ 
  return new Date(
    this.getUTCFullYear(),
    this.getUTCMonth(),
    this.getUTCDate(),
    this.getUTCHours(),
    this.getUTCMinutes(), 
    this.getUTCSeconds()
  ).getTime(); 
}

그것은 나에게 조금 복잡해 보입니다. 그리고 성능에 대해서도 확신이 없습니다.


나는 이것이 오래된 질문이라는 것을 알고 있지만 Date 객체와 같은 기본 객체를 확장하지 마십시오. 내가 질문 자체를 좋아하기 때문에 공감.
trysis

Date.parse (new Date (). toUTCString ())
Sagi

25
이것은 오늘 내 피드에 나온 오래된 질문이며 잘못된 정보로 가득합니다. 타임 스탬프는 항상 UTC입니다. new Date().toString()당신에게 현재 시간대의 시간 표현을 표시합니다, new Date().toUTCString()당신에게 UTC 시간에 repr을 보여 주지만 것 new Date().getTime()입니다 항상 UTC "(또한 POSIX 시간 또는 획기적인 시간이라고도 함) 유닉스 시간 순간을 설명하기위한 시스템입니다 : 즉 유닉스 시간으로 정의됩니다 무엇 때문에, 1970 년 1 월 1 일 목요일 00:00:00 협정 세계시 (UTC) 이후로 경과 한 시간 (초)으로 정의됩니다. "
Amadan

답변:


155
  1. 이러한 방식으로 생성 된 날짜는 현지 시간대를 사용하여 생성 된 날짜를 잘못 만듭니다. 특정 날짜 객체의 시간대를 설정하려면 시간대를 포함하는 날짜 문자열에서 시간대를 생성해야합니다. (이전 Android 브라우저에서 작동하게하는 데 문제가있었습니다.)

  2. getTime()평 초가 아닌 밀리 초 를 반환합니다.

UTC / Unix 타임 스탬프의 경우 다음과 같이 충분합니다.

Math.floor((new Date()).getTime() / 1000)

현재 시간대 오프셋을 결과에 반영합니다. 문자열 표현의 경우 David Ellis의 답변이 효과가 있습니다.

명확히하기 위해 :

new Date(Y, M, D, h, m, s)

해당 입력은 현지 시간으로 처리됩니다 . 경우 UTC 시간이 전달되고, 결과는 다를 수 있습니다. 관찰하십시오 (현재 GMT +02 : 00에 있으며 07:50입니다).

> var d1 = new Date();
> d1.toUTCString();
"Sun, 18 Mar 2012 05:50:34 GMT" // two hours less than my local time
> Math.floor(d1.getTime()/ 1000)
1332049834 

> var d2 = new Date( d1.getUTCFullYear(), d1.getUTCMonth(), d1.getUTCDate(), d1.getUTCHours(), d1.getUTCMinutes(), d1.getUTCSeconds() );
> d2.toUTCString();
"Sun, 18 Mar 2012 03:50:34 GMT" // four hours less than my local time, and two hours less than the original time - because my GMT+2 input was interpreted as GMT+0!
> Math.floor(d2.getTime()/ 1000)
1332042634

또한 getUTCDate()로 대체 할 수 없습니다 getUTCDay(). 그 달의 날짜를getUTCDate() 반환 하기 때문입니다 . 반면 요일을 반환 합니다 .getUTCDay()


1
1) 날짜를 만들지 않았습니다 ... 작업을 수행 한 프로토 타입 함수를 추가했습니다 . 2) 좋은 지적은 Math.floor / 1000을 수행해야하지만 기존 날짜 객체 의 UTC 타임 스탬프를 유지하려면 해당 함수가 필요하다는 것입니다 .
Merc

@Merc : 1) 당신이 호출 new Date()하는 UTC 입력으로부터 새로운 날짜를 생성하지만 현지 날짜 / 시간으로 취급합니다. 2) 예, Math.floor(this.getTime() / 1000)이 경우에 사용해야합니다 .
DCoder

코드를 업데이트해야 할 때 여기에 응답하는 중 ... 기존 날짜 의 유닉스 타임 스탬프를 UTC로 표시하는 것입니다 . function () {return Math.floor (new Date (this.getUTCFullYear (), this.getUTCMonth (), this.getUTCDate (), this.getUTCHours (), this.getUTCMinutes (), this.getUTCSeconds () ..getTime () / 1000); } 이것은 내가 할 수 있음을 의미합니다. var n = new Date (2008,10,10) ... ... n.getUTCTime (); (이것은 n.getUTCTime ()과 다름)
Merc

1
감사합니다 브로 그 작업 파일 Math.floor ((새 Date ()) 다음 getTime () / 1000.)
마노 파텔

51

getTimezoneOffset 및 getTime을 사용하여 수행 할 수도 있습니다.

x = new Date()
var UTCseconds = (x.getTime() + x.getTimezoneOffset()*60*1000)/1000;

console.log("UTCseconds", UTCseconds)


4
고마워, 이것은 인터넷에서 찾을 수 없습니다!
Theofanis Pantelides

다음 코드를 테스트합니다 var tt = new Date('Thu Jan 01 1970 08:00:00 GMT+0800 (China Standard Time)'); (tt.getTime() - tt.getTimezoneOffset()*60*1000)/1000.. 에 tt.getTime() - tt.getTimezoneOffset()대한 것 같습니다 GMT+0800.
zangw

1
이것은 더 좋습니다var UTCseconds = (Math.floor(x.getTime()/1000) + x.getTimezoneOffset()*60)
StefansArya

이것은 기록 된대로 작동하지 않는 것 같습니다 new Date(). 시간대를 포함하는 시간 문자열을 전달해야하는 것 같습니다. 이는 js에서 수행하려는 목적을 다소
상실합니다

이것은 단순히 잘못된 것이며 UTCseconds에 할당 된 값 UTC 초가 아닙니다 . Date의 시간 값 UTC이며, 다른 시점을 나타내는 방법에 따라 변경됩니다.
RobG

34

일반적인 형식으로 UTC 시간을 얻는 가장 쉬운 방법은 다음과 같습니다.

new Date().toISOString()
"2016-06-03T23:15:33.008Z"

3
이것이 정답입니다. 다른 많은 답변은 "범용 시간 문자열"을 제공하지만 현재 "범용 좌표 시간"은 제공하지 않습니다. 나는 왜 모든 것이 여기에서 그렇게 복잡한 지 이해하지 못한다.
gburton

@gburton에게 감사합니다. 당신이 진실로가는 간단한 방법을 본다는 것을 감사하십시오. :)
Tahsin Turkoz

1
YYYY-MM-DD 날짜 기반 비교를 쉽게하기 위해 ".split ( 'T') [0]"과 함께 이것을 사용합니다.
Sean O

니스 @SeanO해야합니다
Tahsin Turkoz

이것은 UTC 시간 문자열을 제공하지만, 영업 이익은 UTC의 요구되는 타임 스탬프 (시대)
조르디 Nebot

13

실제로 js의 Date 값이 C # DateTime 객체를 말하는 것보다 훨씬 낫다고 생각합니다. C # DateTime 개체에는 Kind 속성이 있지만 엄격한 기본 시간대는 없으며 UTC 이외의 시간과 현지 시간이 아닌 두 시간 사이를 변환하는 경우 시간대 변환을 추적하기가 어렵습니다. js에서 모든 Date 값은 기본 UTC 값을 가지며, 이는 UTC 또는 표준 시간대 변환에 ​​관계없이 전달되고 알려져 있습니다. Date 객체에 대한 가장 큰 불만은 브라우저 구현자가 포함하기로 선택한 정의되지 않은 동작의 양으로, js에서 날짜를 공격하는 사람들을 사양을 읽는 것보다 시행 착오와 혼동시킬 수 있습니다. iso8601.js와 같은 것을 사용하면 Date 객체의 단일 구현을 정의하여 이러한 다양한 동작을 해결할 수 있습니다.

기본적으로 스펙은 ISO 8601 날짜 형식으로 확장하여 날짜를 만들 수 있다고 말합니다.

var someDate = new Date('2010-12-12T12:00Z');

따라서이 방법으로 정확한 UTC 시간을 유추 할 수 있습니다.

Date 값을 서버로 다시 전달하려면 전화하십시오.

someDate.toISOString();

또는 밀리 초 타임 스탬프 (1970 년 1 월 1 일 UTC UTC 밀리 초)로 작업하려는 경우

someDate.getTime();

ISO 8601이 표준입니다. 날짜 오프셋을 포함하면 날짜 문자열의 의미에 대해 혼동 할 수 없습니다. 개발자로서 이것이 의미하는 바는 현지 시간 변환을 직접 처리 할 필요가 없다는 것 입니다. 현지 시간 값은 사용자의 편의를 위해 존재하며 기본적으로 날짜 값은 현지 시간으로 표시됩니다. 모든 현지 시간 조작을 통해 사용자에게 합리적인 것을 표시하고 사용자 입력에서 문자열을 변환 할 수 있습니다. 가능한 빨리 UTC로 변환하는 것이 좋으며 js Date 객체는 이것을 사소한 것으로 만듭니다.

단점은 웹 사이트 특정 설정에 대해 성가 시게 할 수있는 클라이언트 또는 시간대 (로컬)를 강제로 적용 할 수있는 범위가 많지 않지만 그 이유는 사용자라는 것입니다. 손대지 말아야 할 구성.

즉, 표준 시간대 조작에 대한 기본 지원이 많지 않은 이유는 단순히 수행하고 싶지 않기 때문입니다.


12

일반적으로 클라이언트 측에서 "시간대 조작"을 많이 수행 할 필요는 없습니다. 원칙적으로 난의 형태로 UTC 날짜와 저장 및 작업에 시도 ticks"또는 1970 년 1 월 1 일 자정 이후의 밀리 초 수를 ." 이를 통해 스토리지, 정렬, 오프셋 계산을 단순화하고 무엇보다도 "일광 절약 시간"조정의 어려움을 없애줍니다. 여기 내가 사용하는 작은 JavaScript 코드가 있습니다.

현재 UTC 시간을 얻으려면

function getCurrentTimeUTC()
{
    //RETURN:
    //      = number of milliseconds between current UTC time and midnight of January 1, 1970
    var tmLoc = new Date();
    //The offset is in minutes -- convert it to ms
    return tmLoc.getTime() + tmLoc.getTimezoneOffset() * 60000;
}

그런 다음 일반적으로 필요한 것은 최종 사용자의 날짜 / 시간을 현지 시간대 및 형식으로 지정하는 것입니다. 다음은 클라이언트 컴퓨터의 모든 날짜 및 시간 형식 복잡성을 처리합니다.

function formatDateTimeFromTicks(nTicks)
{
    //'nTicks' = number of milliseconds since midnight of January 1, 1970
    //RETURN:
    //      = Formatted date/time
    return new Date(nTicks).toLocaleString();
}

function formatDateFromTicks(nTicks)
{
    //'nTicks' = number of milliseconds since midnight of January 1, 1970
    //RETURN:
    //      = Formatted date
    return new Date(nTicks).toLocaleDateString();
}

function formatTimeFromTicks(nTicks)
{
    //'nTicks' = number of milliseconds since midnight of January 1, 1970
    //RETURN:
    //      = Formatted time
    return new Date(nTicks).toLocaleTimeString();
}

따라서 다음 예제는

var ticks = getCurrentTimeUTC();  //Or get it from the server

var __s = "ticks=" + ticks + 
    ", DateTime=" + formatDateTimeFromTicks(ticks) +
    ", Date=" + formatDateFromTicks(ticks) +
    ", Time=" + formatTimeFromTicks(ticks);

document.write("<span>" + __s + "</span>");

다음을 반환합니다 (미국 영어 로캘).

틱 = 1409103400661, DateTime = 8 / 26 / 2014 6:36:40 PM, Date = 8 / 26 / 2014, 시간 = 6 : 36 : 40 PM


1
함수에 getTimezoneOffset값 을 추가하면 getCurrentTimeUTC실제로 다른 시점을 반환합니다. 결과 getTime이미 UTC입니다.
Matt Johnson-Pint

1
@MattJohnson : 맞지 않습니다. 결과는 tmLoc.getTime()현지 시간에 대한 오프셋입니다. JavaScript를 실행하는 모든 것에 액세스 할 수 있는지 쉽게 확인할 수 있습니다.
ahmd0

2
죄송하지만 사실이 아닙니다. 참조 MDN 참조 . ECMAScript 사양에서도 볼 수 있습니다. §15.9.3.3 설명getTime 에 정의 된 "시간 값"에서 당신을 가리키는, §15.9.5 이다, PrimitiveValue에 세트로, §15.9.3.3 명시 적으로 UTC로.
Matt Johnson-Pint

2
tmLoc를 통해 얻을 수 있기 때문에 new Date()같은 것입니다. 표준 시간대는 tmLoc.toString()비슷한 항목 의 문자열 출력에 영향을 주지만 영향을 미치지 않습니다 tmLoc.getTime() . 1970 년 1 월 1 일 자정 (UTC) 이후로 항상 밀리 초입니다.
Matt Johnson-Pint

1
@StefansArya ://The offset is in minutes -- convert it to ms
ahmd0 2016 년

5

나는 이것이 더 나은 해결책이라고 생각한다

// UTC milliseconds
new Date(Date.now()+(new Date().getTimezoneOffset()*60000)).getTime()

// UTC seconds
new Date(Date.now()+(new Date().getTimezoneOffset()*60000)).getTime()/1000|0

또 다른 잘못된 대답 인 getTime 은 UTC 오프셋을 반환하고 로컬 시간대 오프셋을 추가하면 완전히 엉망이됩니다. ECMAScript 오프셋은 서쪽의 경우 + ve, 동쪽의 경우 -ve이므로 UTC에서 빼서 로컬로 가져와야합니다. 그러나 시간 값은 UTC로 시작하므로 시간을 추가하면 UTC에서 로컬 오프셋과 반대 방향으로 본질적으로 이동합니다.
RobG

4

당신이 원하는 경우 하나 라이너UTC 유닉스 타임 스탬프는 자바 스크립트로 생성 할 수 있습니다 :

var currentUnixTimestap = ~~(+new Date() / 1000);

이것은 시스템의 시간대를 고려합니다. 기본적으로 에포크 (epoch) 이후의 시간 (초)입니다.

작동 방식 :

  • 날짜 객체 생성 : new Date().
  • unary +객체 생성 전에 를 추가하여 타임 스탬프 로 변환하여로 변환하십시오 timestamp integer. : +new Date().
  • 밀리 초를 초로 변환하십시오. +new Date() / 1000
  • 이중 물결표 를 사용 하여 값을 정수로 반올림하십시오. :~~(+new Date())

7
그건 tilde,하지 tilda(원문). 슬프게도 오타를 제거 할 수 없으므로 적어도 6 자의 문자를 편집해야합니다. 스무스, 스택 교환, 스무드
Fred

3
이것을 사용하지 마십시오 . 현재 ecma 사양을 사용하면 물결 기호와 같은 비트 단위 연산은 32 비트의 부호있는 정수 값을 처리합니다. 이는 타임 스탬프 값이 32 비트 부호있는 정수의 최대 값을 초과하는 2038 년 1 월 19 일 이후이 물결표 마법 이 작동하지 않음을 의미합니다 . jsfiddle.net/phb20ymb
Sharky

3

new Date (). getTime ()이 실제로 UTC 값을 반환한다는 것을 분명히하고 싶습니다. 따라서 현지화 된 시간과 무관 한 방식으로 날짜를 저장하고 관리하는 것이 실제로 도움이됩니다.

다시 말해, 모든 UTC 자바 스크립트 함수를 신경 쓰지 마십시오. 대신 Date.getTime ()을 사용하십시오.

설명에 대한 자세한 정보는 다음과 같습니다. javascript "(new Date ()). getTime ()"이 두 개의 다른 시간대에서 실행되는 경우.


3

나는 다음을 사용한다 :

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

이 방법을 정의하면 다음을 수행 할 수 있습니다.

var utcTime = new Date().getUTCTime();

가장 깨끗한 솔루션. 고마워!
avalanche1

그러나 TimeStamp는 항상 UTC이기 때문에 날짜를 보내는 깨끗한 솔루션은 아닙니다. 날짜를 보낼 때 가장 좋은 해결책은 "dd / MM / yyyy HH : mm : ss"와 같은 문자열 표현을 사용한 다음 서버의 기본 TimeZone으로 구문 분석하여 UTC 타임 스탬프 등을 얻는 것입니다. 이 답변
jlbofh

2
문자열 파싱-당신은 그것을 깨끗하게 부르고 있습니까? meh
눈사태 1

ISO 사양에 따라 문자열 형식으로 날짜를 생성하는 방법이 있어야합니다. 메소드는 toISOString ()입니다. : 당신은 같은 것을 사용하여 Java에서 깔끔하게을 구문 분석 할 수DateTime dt = new DateTime ("2018-07-15T02:36:00+02:00");
jlbofh

또 다른 오답 this.getTime()은 UTC 오프셋을 반환하고 현지 시간대 오프셋을 빼면 UTC가 아닌 로컬 시간대 오프셋을 반환 하므로 getUTCTime 은 UTC 가 아닌 로컬 오프셋을 반환합니다.
RobG

2

이 질문이 얼마나 복잡한 지 놀랐습니다.

이들은 모두 동일하며 정수 값은 모두 === EPOCH time : D

console.log((new Date()).getTime() / 1000, new Date().valueOf() / 1000, (new Date() - new Date().getTimezoneOffset() * 60 * 1000) / 1000);

저를 믿지 마세요, 체크 아웃 : http://www.epochconverter.com/


2

new Date().toUTCString()문자열을 반환 하므로 "Wed, 11 Oct 2017 09:24:41 GMT"마지막 3자를 슬라이스하고 슬라이스 문자열을 new Date()다음으로 전달할 수 있습니다 .

new Date()
// Wed Oct 11 2017 11:34:33 GMT+0200 (CEST)

new Date(new Date().toUTCString().slice(0, -3))
// Wed Oct 11 2017 09:34:33 GMT+0200 (CEST)

1

편집 : 아래 코드가 작동하지 않습니다. 나는 항상 새로운 Date (). getTime ()이 1970 년 1 월 1 일 현재 시간 영역에서 초를 반환한다고 가정했습니다. 그렇지 않습니다. getTime ()은 초를 초 단위로 반환합니다. 따라서 아래 코드는 과도하게 조정됩니다. 모두 감사합니다!]

우선, 환상적인 통찰력에 감사드립니다. 내 질문에 잘못된 제목이 있다고 생각합니다. "기존 날짜의 UTC 유닉스 타임 스탬프를 가져 오십시오".

따라서 날짜 객체가 있다면 :

var d = new Date(2009,01,31)

"UTC Unix Timestamp"라고 알려주는 기능을 수행했습니다.

이 기능은 실제 트릭 인 것 같습니다.

Date.prototype.getUTCUnixTime =  function (){
  return Math.floor( new Date(
    this.getUTCFullYear(),
    this.getUTCMonth(),
    this.getUTCDate(),
    this.getUTCHours(),
    this.getUTCMinutes(), 
    this.getUTCSeconds()
  ).getTime() / 1000); 
}

"this"에서 작동합니다. 이것은 내가 할 수 있음을 의미합니다.

var n = new Date(2008,10,10)
...
...

n.getUTCUnixTime();

그리고 1970 년 1 월 1 일부터 유닉스 시간으로 초를 얻습니다. 권리?

Javascript가 모든 것을 UTC 시간으로 저장한다는 것은 약간 미친 일이지만 그 숫자를 얻으려면 개별 UTC getter를 전달하는 새 Date 객체를 만든 다음 getTime ()을 호출해야합니다.

머서.


1
@DCoder가 그의 답변에 대한 업데이트를 보았습니까? 메소드 getUTCUnixTime가 틀린 시간을 얻었고 JavaScript 메소드를 Date사용하여 객체 에서 유닉스 타임 스탬프를 얻는 간단한 방법을 제공합니다 getTime. 다른 모든 답변을 참조하십시오.
Anurag

1
당신이 옳아 요, 그냥 봤어요 (벽에 머리를 대고)
Merc Merc

1

나는 당신이 기대하는 것을 생각합니다 ...

var currTimestamp = Date.now(), //1482905176396
    utcDateString = (new Date(currTimestamp)).toUTCString(); //"Wed, 28 Dec 2016 06:06:50 GMT"

지금,

new Date(utcDateString).getTime(); //This will give you UTC Timestamp in JavaScript


0

day.js 사용

브라우저에서 :

dayjs.extend(dayjs_plugin_utc)
console.log(dayjs.utc().unix())
<script src="https://cdn.jsdelivr.net/npm/dayjs@latest/dayjs.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@latest/plugin/utc.js"></script>

node.js에서 :

import dayjs from 'dayjs'
dayjs.extend(require('dayjs/plugin/utc'))
console.log(dayjs.utc().unix())

밀리 초없이 UTC 유닉스 타임 스탬프를 얻습니다.


-2

타임 스탬프를 UTC로 반환합니다.

var utc = new Date(new Date().toUTCString()).getTime();


2
이것은 UTC로 시간을 반환하지 않습니다 : new Date(new Date().toUTCString())제공 Wed Oct 04 2017 07:20:14 GMT + 0200 (GMT + 02 : 00)
Bas van Dijk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.