JavaScript 날짜를 UTC로 어떻게 변환합니까?


590

웹 사이트 사용자가 기간을 입력한다고 가정 해 보겠습니다.

2009-1-1 to 2009-1-3

일부 처리를 위해이 날짜를 서버로 보내야하지만 서버는 모든 날짜와 시간이 UTC로 예상됩니다.

이제 사용자가 알래스카, 하와이 또는 피지에 있다고 가정합니다. UTC와는 시간대가 다르므로 날짜 범위를 다음과 같이 변환해야합니다.

2009-1-1T8:00:00 to 2009-1-4T7:59:59

JavaScript Date 객체를 사용하여 첫 번째 "현지화 된"날짜 범위를 서버가 이해할 수있는 것으로 변환하는 방법은 무엇입니까?


10
Google에서 가장 많이 히트 한 것이기 때문에 이것을 부활 시켰으며 최신 브라우저는 UTC 날짜 문자열을 기본적으로 지원합니다.
jcomeau_ictx 2018 년

4
새로운 ECMAscript 5 toISOString () 메서드를 강조하기 위해 허용 된 답변을 업데이트했습니다. 참조 stackoverflow.com/a/11957822/19112
dthrasher

5
그래서 2015 년에 나는 문자열 화 및 구문 분석 날짜를 망쳐 놓아야합니까? 어리석은!
툴킷

2
물론 있습니다. 당신은 다른 사람이 당신을 위해 일하는 다른 사람에게 의지 할 수 없습니다. -P 적어도 세계가 시간대 사용을 중단하고 날짜와 시간을 통합하기 시작할 때까지.
Erenor Paz

4
바람직하게는 "스타 데이트".
Michael Daw

답변:


370

toISOString()메서드는 단순화 된 확장 ISO 형식 ( ISO 8601 ) 으로 문자열을 반환하며 , 길이는 항상 24 자 또는 27 자 ( YYYY-MM-DDTHH:mm:ss.sssZ또는 ±YYYYYY-MM-DDTHH:mm:ss.sssZ)입니다. 표준 시간대는 접미사 " Z" 로 표시된대로 항상 0 UTC 오프셋 입니다.

출처 : MDN 웹 문서

필요한 형식은 .toISOString()메소드를 사용하여 작성됩니다 . 이 방법을 기본적으로 지원하지 않는 구형 브라우저 (예 : 8 이하)의 경우 shim은 다음 위치에서 찾을 수 있습니다 .

이를 통해 필요한 작업을 수행 할 수 있습니다.

var isoDate = new Date('yourdatehere').toISOString();

시간대 작업의 경우 moment.js 및 moment.js 시간대 는 특히 클라이언트와 서버 자바 스크립트 사이의 시간대를 탐색하는 데 매우 유용한 도구입니다.


81
실제로이 문자열로 날짜 개체를 변환, 그것을 더 최신의 작업을 수행 할 수 없습니다
orszaczky

2
@TheRebel, 주어진 유스 케이스는 서버에게 형식화 된 문자열을 보내야한다는 것입니다.
Will Stern

28
@Will, 당신은 완전히 맞아, 그러나 - 여기에 시청자의 대부분은 내가 생각하는 것처럼 - 나는 그것이 :) 여기에 그것을 언급하는 것이 유용 생각, 그래서 내가 UTC 변환 일반 JS 날짜 검색, 제목에 따라 여기에 도착
orszaczky

4
이 방법을 사용할 때는주의하십시오! UTC 날짜를 만들지 않습니다. 기존 날짜 데이터를 그대로 UTC 형식으로 포맷하고 "Z"시간대를 지정합니다. 이것은 시간의 99 %입니다! 이 방법을 사용하기 전에 날짜를 GMT 시간대로 변환해야합니다!
user1944491

5
@ user1944491 이것이 정확하지 않다고 생각합니다. MDN 문서에 따르면 toISOStringUTC로 올바르게 변환됩니다. [toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offset또한이 예에서는 toISOString이 호출 될 때 오프셋이 고려됨을 보여줍니다.
FFF

560

간단하고 바보

var date = new Date(); 
var now_utc =  Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),
 date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());

 return new Date(now_utc);

85
나는 당신의 생각을 좋아했고 여러 번 사용했던 방법을 사용했습니다. function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
Tim

21
UTC 날짜와 시간을 얻기 위해 내가 new Date(new Date().toUTCString().substr(0, 25))
찾은

17
getUTCMonth ()는 0에서 11까지의 값을 리턴합니다. 따라서 문자열 대신 숫자로 월을 필요로하는 경우 값에 +1하는 데 도움이됩니다.
Talvi Watia

19
이것은 말도 안됩니다. 새 날짜는 실제로 원하는 것과 다른 값을 갖습니다. now.toUTCSTring()(잘못된) 대신 사용하십시오 now_utc.toString().
Bergi

22
나는 이것을 사용하지 않을 것입니다-new Date ()를 사용하면 형제의 시간대를 얻습니다. Chrome 29 및 IE10에서 날짜와 시간은 정확한 것처럼 보이지만 시간대는 브라우저의 시간대로 설정되어 문제가 발생할 수 있습니다.
Sean

207

내 방법은 다음과 같습니다.

var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

결과 utc객체는 실제로 UTC 날짜가 아니지만 현지 날짜가 UTC 시간과 일치하도록 이동했습니다 (주석 참조). 그러나 실제로는 작업을 수행합니다.


Date.now()UTC 시간이 아닌 현지 시간 을 제공 한다는 것을 깨달았을 때이 문제를보고 있었고이 솔루션이 가장 단순 해 보입니다. 적어도 제 경우에는 유닉스 타임을 원하지만 형식이 좋은 문자열은 아닙니다. (단 하나의 차이점은 내가 60 * 1000명확하게하기 위해 곱한 것입니다. )
Timothée Boucher

18
60000 추가 * Date.getTimezoneOffset ()이 올바르지 않습니다! 먼저, 표시를 위해 시간대 수정자를 사용하여 모든 날짜 / 시간을 이미 UTC로 생각해야합니다. 브라우저마다 다를 수 있지만 Date.getTime ()은 1970-01-01 이후 밀리 초 수를 반환합니다. 이 번호를 사용하여 새 날짜를 작성하는 경우 예 : new Date (Date.getTime ()); 그것은 UTC 될 것입니다 당신이 그것을 표시 할 때 그러나, (예를 : 크롬 개발 도구 콘솔을 통해)이 해당 지역의 시간대로 표시됩니다.
Aaron Hoffman

15
내 브라우저에서 UTC가 아닌 DateTime을 만듭니다. 그러나 내 브라우저에 표시되면 시간대 정보가 무시되면 UTC 시간으로 올바른 현지 시간대의 DateTime이 표시됩니다.
Aaron Hoffman

흥미로운 점이 있습니다. 하자의 비교 now.toString()와 함께 utc.toString(): 아무 시간대 변화는 없지만 시간 변경, 매우 다른 일이다. 그러나 더 깨끗한 솔루션은 훨씬 더 복잡 할 것입니다 (그렇다고 생각합니다).이 코드는 시간대를 더 이상 다루지 않는 한 대부분의 경우에 작동합니다. 오리 펀치 에 대해 생각 나게했습니다 : 다른 것은 있지만 똑같이 행동했습니다. 또한 DrunkCoder의 코드에도 동일한 문제가 있습니다.
Gras Double

4
이 답변은 DST 전환과 같은 엣지 케이스가 실패 할 수 있기 때문에 격리에 위험한 "에포크 시프 팅"의 또 다른 일반적인 구현을 보여줍니다. 권장하지 않습니다.
Matt Johnson-Pint

25
Date.prototype.toUTCArray= function(){
    var D= this;
    return [D.getUTCFullYear(), D.getUTCMonth(), D.getUTCDate(), D.getUTCHours(),
    D.getUTCMinutes(), D.getUTCSeconds()];
}

Date.prototype.toISO= function(){
    var tem, A= this.toUTCArray(), i= 0;
    A[1]+= 1;
    while(i++<7){
        tem= A[i];
        if(tem<10) A[i]= '0'+tem;
    }
    return A.splice(0, 3).join('-')+'T'+A.join(':');    
}

이것은 잘 작동합니다. JavaScript 날짜를 만들기 위해 소스 날짜의 "-"를 "/"로 바꾸어야했는데 toISO () 함수를 호출하여 올바른 출력을 얻을 수있었습니다.
dthrasher 2016 년

이것은 잘 작동합니다. 결과를 jQuery $ .parseDate (...)에 피드하여 UTC로 이동 된 날짜 객체를 다시 가져올 수도 있습니다.
Brian Ellis

23

날짜 / 시간을 변경하지 않고 ISO로 변환

var now = new Date(); // Fri Feb 20 2015 19:29:31 GMT+0530 (India Standard Time) 
var isoDate = new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString();
//OUTPUT : 2015-02-20T19:29:31.238Z

날짜 / 시간 변경으로 ISO로 변환 (날짜 / 시간 변경)

isoDate = new Date(now).toISOString();
//OUTPUT : 2015-02-20T13:59:31.238Z 

바이올린 링크


그래서 이것은 일종의 가짜 UTC입니까? 현지 날짜를 변경하고 실제로 PC 시계에서 볼 수있는 날짜와 시간을 서버에 제출합니다. 와. 어쨌든 strinifying 및 parsing보다 나은
Toolkit

또한 .toISOString ()이 필요하지 않습니다. isoDate를 서버로 보낼 수 있습니다
Toolkit

.toISOString ()은 간단하고 직선적이며, 날짜가 지날수록 추가 단계가됩니다 (isoDate는 함수가 아닙니다).
RollerCosta

빼기 대신 오프셋을 추가 할 필요가 없습니까? stackoverflow.com/a/11964609/832230
Acumenus를

@ABB 현재 시간대 오프셋이 + ve 인 경우 빼야합니다 (이 경우 IST는 +5 : 30 임). 그렇지 않으면 더합니다.
RollerCosta

18

브라우저가 다를 수 있으며 클라이언트가 생성 한 정보를 신뢰할 수 없다는 것을 명심해야합니다. 아래 내용은 저에게 효과적입니다 (Mac OS X 10.8.2의 Chrome v24)

var utcDate = new Date(new Date().getTime());


편집 : "이것은 단지 new Date()어떻게 다른 가요?" 여기를 참조하십시오 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

  • 인수가 제공되지 않으면 생성자는 시스템 설정에 따라 현재 날짜 및 시간에 대한 JavaScript Date 객체를 만듭니다.
  • 참고 : Date가 둘 이상의 인수가있는 생성자로 호출 된 경우 지정된 인수는 현지 시간을 나타냅니다. UTC가 필요한 경우 동일한 인수로 new Date ( Date.UTC (...) )를 사용하십시오. (참고 : Date.UTC ()는 1970-01-01 00:00:00 UTC 이후의 밀리 초 수를 반환합니다)

이전 답변에서 언급했듯이 60000 * Date.getTimezoneOffset () 추가가 올바르지 않습니다. 먼저, 표시를 위해 시간대 수정자를 사용하여 모든 날짜 / 시간을 이미 UTC로 생각해야합니다.

브라우저마다 다를 수 있지만 Date.getTime ()은 1970-01-01 UTC / GMT 이후 밀리 초 수를 반환합니다. 위에서와 같이이 번호를 사용하여 새 날짜를 만들면 UTC / GMT가됩니다. 그러나 .toString ()을 호출하여 표시하는 경우 .toString ()은 호출 된 Date 객체의 시간대가 아닌 현지 시간대를 사용하므로 현지 시간대에있는 것으로 나타납니다.

또한 날짜에 .getTimezoneOffset ()을 호출하면 호출 한 날짜 객체의 시간대가 아닌 로컬 시간대를 반환한다는 것을 알았습니다 (그러나 이것이 표준인지 확인할 수는 없습니다).

브라우저에서 60000 * Date.getTimezoneOffset ()을 추가하면 UTC아닌 DateTime이 생성 됩니다. 그러나 내 브라우저 (예 : .toString ())에 표시되면 시간대 정보가 무시되면 UTC 시간이 맞는 현지 시간대의 DateTime이 표시됩니다.


11
방금 Fx와 Chrome에서이 코드를 실행했는데 작동하지 않는 것 같습니다. 결과는와 정확히 동일하며 new Date()타임 스탬프와 시간대가 변경되지 않았습니다.
Gras Double

3
타임 스탬프가 시간대가 없기 때문입니다. new Date().getTime()항상 시간대와 무관 한 타임 스탬프를 반환합니다. 유닉스 시대 이후로 밀리 초 이외의 형식으로 포맷 할 때까지 타임 스탬프가 없습니다.
frontendbeauty

7
내가 알 수있는 한 new Date(new Date().getTime())정확히와 동일한 값을 반환합니다 new Date(). 어떤 의미에서 귀하의 답변이 다른 가치를 제공하는지 설명 할 수 있습니까 new Date()?
Kirk Woll

이 값을 서버에 게시하고 new Date("5/19/2014").getTime()있습니다. Date 생성자는 +7 오프셋으로 날짜를 만들었습니다. 서버 (C #)에서 게시 된 값을 밀리 초로 unix epoch에 추가합니다 new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(1401087600000). 결과는 5/19/2014 7:00:00 AM입니다. 따라서 getTime ()은 UTC 오프셋을 포함하여 밀리 초 수를 제공하는 것으로 보입니다.
xr280xr 2:14에

1
new Date(new Date().getTime())작동하지 않는다고 불평하는 의견이 많이 있습니다. new Date(Date.UTC(2019, 8, 27, 0, 0, 0))실제로 UTC 시간을 생성 한다는 것을 확인할 수 있습니다 . 사용하지 않으면 Date.UTC(...)시간대에 UTC 오프셋으로 날짜가 표시됩니다.
Alex Barker

15
var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();

1
날짜 개체는 실제로 날짜로 설정해야합니다. 위는 단지 예입니다.
James Skidmore

5
이제 OP에 필요한 ISO 형식이 아닌 "Thu, 04 Jun 2009 04:10:56 GMT"를 반환합니다.
nickf 2016 년

4
이것은 날짜가 아닌 문자열로 바뀝니다.
Anthony

2
아니요, 실제로 OP에 따른 날짜의 문자열 표현이어야합니다.
jcomeau_ictx

3
UTC로 변환 한 후에는 문자열 형식으로 반환 된 다음 getMonth (), getDate () 등과 같은 메소드에 액세스하는 방법
Sandeep sandy

10

UTC로 변환하여 날짜 객체로 유지하는 또 다른 솔루션 : (형식화 된 문자열의 끝에서 'GMT'부분을 제거한 다음 다시 Date 생성자에 넣는 방식으로 작동합니다)

var now = new Date();
var now_utc = new Date(now.toUTCString().slice(0, -4));

datetime picker 라이브러리와 인터페이스하기 위해이 작업을 수행해야했습니다. 그러나 일반적으로 이런 식으로 날짜를 다루는 것은 좋지 않습니다.

사용자는 일반적으로 현지 시간으로 날짜 시간으로 작업하기를 원하므로 서버 측 코드를 업데이트하여 날짜 시간 문자열을 오프셋으로 올바르게 구문 분석 한 다음 UTC (최상의 옵션)로 변환하거나 UTC 문자열 클라이언트 측으로 전송하기 전에 서버 (윌 스턴의 답변에서와 같이)


7

날짜를 그런 문자열로 변환하려고합니까?

그 기능을 만들고 약간 논란의 여지가 있지만 Date 프로토 타입에 추가하십시오. 그렇게하기에 불편한 경우 날짜를 매개 변수로 전달하여 독립형 함수로 사용할 수 있습니다.

Date.prototype.getISOString = function() {
    var zone = '', temp = -this.getTimezoneOffset() / 60 * 100;
    if (temp >= 0) zone += "+";
    zone += (Math.abs(temp) < 100 ? "00" : (Math.abs(temp) < 1000 ? "0" : "")) + temp;

    // "2009-6-4T14:7:32+10:00"
    return this.getFullYear()   // 2009
         + "-"
         + (this.getMonth() + 1) // 6
         + "-"
         + this.getDate()       // 4
         + "T"
         + this.getHours()      // 14
         + ":"
         + this.getMinutes()    // 7
         + ":"
         + this.getSeconds()    // 32
         + zone.substr(0, 3)    // +10
         + ":"
         + String(temp).substr(-2) // 00
    ;
};

UTC 시간으로 필요한 경우 getUTC *로 모든 get * 함수를 바꾸십시오 (예 : getUTCFullYear, getUTCMonth, getUTCHours ...). 그런 다음 사용자 시간대 오프셋 대신 "+00 : 00"을 추가하십시오.


1
이것은 시간대 오프셋을 처리하려고 시도한 첫 번째 예이므로 +1입니다. 그러나 문자열이 아닌 숫자이기 때문에 temp.substr (-2) 오류가 발생하므로 "temp = ''+ temp;"와 같은 작업을 수행해야합니다. 먼저 문자열로 바꾸십시오. 또한 ISO 날짜가 0으로 채워지는 것을 선호합니다. 표준이 더 표준이라고 생각합니다.
Mick Sear 2016 년

@Mick-해당 버그를 수정하도록 업데이트했습니다. 요즘 String(temp)다른 방법 ( "" + temp)이 JSLint 오류로보고되었으므로 사용했습니다.
nickf

이것은 이제 toISOString방법으로
Bergi

7
date = '2012-07-28'; stringdate = new Date(date).toISOString();

대부분의 최신 브라우저에서 작동해야합니다. 2012-07-28T00:00:00.000ZFirefox 6.0에서 반환


7

날짜 작업시 권장 사항은 사용자 입력에서 날짜를 개별 필드로 구문 분석하는 것입니다. 당신은 전체 문자열로 사용할 수 있지만, 당신은 불을 가지고 놀고 있습니다.

JavaScript는 서로 다른 형식의 두 개의 동일한 날짜를 다르게 처리 할 수 ​​있습니다.

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

다음과 같은 작업을 수행하지 마십시오.

new Date('date as text');

사용자 입력에서 날짜를 개별 필드로 구문 분석 한 후 날짜 오브젝트를 작성하십시오. 날짜 객체가 생성되면 시간대 오프셋을 추가하여 UTC로 변환하십시오. DST로 인해 날짜 개체의 오프셋을 사용하는 것이 얼마나 중요한지 강조 할 수 없습니다 (그러나 그 이유는 다른 토론입니다).

var year = getFullYear('date as text');
var month = getMonth('date as text');
var dayOfMonth = getDate('date as text');

var date = new Date(year, month, dayOfMonth);

var offsetInMs = ((date.getTimezoneOffset() * 60)  // Seconds
                 * 1000);                          //  Milliseconds

var utcDate = new Date(date.getTime + offsetInMs);

이제 UTC 시간으로 서버에 날짜를 전달할 수 있습니다. 다시 한 번 날짜 문자열을 사용하지 않는 것이 좋습니다. 예를 들어 년, 월, 일, 분 또는 유닉스 시대에서 밀리 초와 같은 값으로 필요한 가장 작은 단위로 세분화하여 서버에 전달하십시오.



6

날짜를 많이 다루는 경우 moment.js ( http://momentjs.com )를 사용하는 것이 좋습니다 . UTC로 변환하는 방법은 다음과 같습니다.

moment(yourTime).utc()

형식을 사용하여 날짜를 원하는 형식으로 변경할 수 있습니다.

moment(yourTime).utc().format("YYYY-MM-DD")

현재 오프셋 옵션도 있지만 시간대를 처리하기위한 추가 보완 라이브러리가 있습니다 ( http://momentjs.com/timezone/ ). 시간 변환은 다음과 같이 간단합니다.

moment.tz(yourUTCTime, "America/New_York")

차이 무엇 moment(yourTime).utc()moment.utc(yourTime)? 나는 보통 후자를 사용합니다.
ps0604

5

내 솔루션은 클라이언트 측에 시간대가 설정되어 있더라도 날짜를 동일하게 유지합니다. 누군가가 유용하다고 생각할 수도 있습니다.

내 유스 케이스 :

작업 날짜를 설정하는 할 일 앱을 만들고 있습니다. 이 날짜는 시간대에 관계없이 일정하게 유지되어야합니다.

예. 6 월 25 일 오전 8시에 친구에게 전화하고 싶습니다.

중국에있는 5 일 전 (6 월 20 일)에이 작업을 만듭니다.

그런 다음 같은 날에 며칠 동안 뉴욕으로 비행합니다.

그런 다음 6 월 25 일에 뉴욕에있는 동안 오전 7시 30 분에 깨어납니다 (30 분 후에 작업 알림을 받아야 함을 의미합니다. 직무)

따라서 작업은 시간대를 무시합니다. 그것은 '내가 어떤 시간대에 있든 오전 8시에하고 싶다'를 의미합니다.

내가하는 것은 '당신은 항상 런던 시간대-UTC에 있다고 가정합니다.'

의미는-사용자가 시간대에서 날짜를 선택하면이 날짜를 UTC의 동일한 날짜로 변환합니다. 즉. 중국에서는 오전 8시를 선택하지만 UTC에서는 오전 8 시로 변환합니다.

그런 다음-다음에 앱을 열 때-UTC로 저장된 날짜를 읽고 현재 시간대의 동일한 날짜로 변환합니다. 뉴욕 시간대로 오전 8시를 오전 8 시로 변환합니다.

이 솔루션은 날짜를 설정할 때의 위치와 읽는 위치에 따라 날짜가 다른 것을 의미 할 수 있지만 항상 같은 시간대에있는 것처럼 느끼는 방식으로 일정하게 유지됩니다.

코드를 작성해 봅시다 :

먼저 시간대를 무시하고 UTC로 변환하는 UTC의 두 가지 주요 기능이 있습니다.

export function convertLocalDateToUTCIgnoringTimezone(date: Date) {
  const timestamp = Date.UTC(
    date.getFullYear(),
    date.getMonth(),
    date.getDate(),
    date.getHours(),
    date.getMinutes(),
    date.getSeconds(),
    date.getMilliseconds(),
  );

  return new Date(timestamp);
}

export function convertUTCToLocalDateIgnoringTimezone(utcDate: Date) {
  return new Date(
    utcDate.getUTCFullYear(),
    utcDate.getUTCMonth(),
    utcDate.getUTCDate(),
    utcDate.getUTCHours(),
    utcDate.getUTCMinutes(),
    utcDate.getUTCSeconds(),
    utcDate.getUTCMilliseconds(),
  );
}

그런 다음이 날짜를 다음과 같이 저장 / 읽습니다.

function saveTaskDate(localDate: Date) {
  // I convert your local calendar date so it looks like you've picked it being in UTC somewhere around London
  const utcDate = convertLocalDateToUTCIgnoringTimezone(localDate);
  api.saveTaskDate(utcDate);
}

function readTaskDate(taskUtcDate: Date) {
  // I convert this UTC date to 'look in your local timezone' as if you were now in UTC somewhere around london
  const localDateWithSameDayAsUTC = convertUTCToLocalDateIgnoringTimezone(taskUtcDate);

  // this date will have the same calendar day as the one you've picked previously
  // no matter where you were saving it and where you are now
}

4

방금 Steven Levithan의 date.format.js 1.2.3 버전이 내가 원하는 것을 수행한다는 것을 알았습니다. JavaScript 날짜의 형식 문자열을 제공 할 수 있으며 현지 시간에서 UTC로 변환됩니다. 지금 사용하고있는 코드는 다음과 같습니다.

// JavaScript dates don't like hyphens!    
var rectifiedDateText = dateText.replace(/-/g, "/");
var d = new Date(rectifiedDateText);

// Using a predefined mask from date.format.js.
var convertedDate = dateFormat(d, 'isoUtcDateTime'); 

9
귀하의 질문에 가장 적합한 답변이 아닌 것 같습니다. 질문에 직접 대답하거나 다르게 질문하는 것을 재고해야합니다.
hitautodestruct

1
이 정확한 스크립트 (및 버전)가 IE7 및 Firefox에 충분하지 않기 때문에 수정하고 있습니다.
Barbarrosa

4

jQuery Globalization Plugin 날짜 구문 분석이 가장 효과적 이라는 것을 알았습니다 . 다른 방법으로는 브라우저 간 문제가 있었고 date.js와 같은 항목은 꽤 오래 업데이트되지 않았습니다.

또한 페이지에 datePicker가 필요하지 않습니다. 문서에 제공된 예제와 비슷한 것을 호출 할 수 있습니다.

$.parseDate('yy-mm-dd', '2007-01-26');

1
무언가가 업데이트되지 않았다고해서 사용해서는 안된다는 의미는 아닙니다. Date.js는 수년 동안 완벽하게 작동했기 때문에 업데이트 할 필요가 없습니다. 지난 몇 년 동안 JS Date Object와 사용중인 날짜 형식이 변경되지 않은 이유는 무엇입니까? Date.JS는 최고의 JS Date 라이브러리입니다. github에는 몇 가지 문제가 있지만 그렇지 않으면 완벽합니다. github.com/datejs/Datejs
thugsb

3

이 기능은 나를 위해 아름답게 작동합니다.

function ParseDateForSave(dateValue) {
    // create a new date object
    var newDate = new Date(parseInt(dateValue.substr(6)));

    // return the UTC version of the date
    return newDate.toISOString();
}


2
var userdate = new Date("2009-1-1T8:00:00Z");
var timezone = userdate.getTimezoneOffset();
var serverdate = new Date(userdate.setMinutes(userdate.getMinutes()+parseInt(timezone)));

적절한 UTC 날짜 및 시간을 제공합니다.
이는 getTimezoneOffset()시간대 차이를 분 단위로 제공 하기 때문 입니다. toISOString()출력이 문자열에 있기 때문에 사용하지 않는 것이 좋습니다. 따라서 나중에 날짜를 조작 할 수 없습니다.



2

Date Object가 필요한 경우

날짜 문자열 만 전달 Date는 표준 시간대로 시간이 00:00으로 이동한다고 가정합니다.

new Date('2019-03-11')
Sun Mar 10 2019 18:00:00 GMT-0600 (Central Standard Time)

현재 시간과 분을 추가하면 올바른 날짜가 표시됩니다.

new Date('2019-03-11 ' + new Date().getHours() + ':' + new Date().getMinutes())
Mon Mar 11 2019 04:36:00 GMT-0600 (Central Standard Time)

1

질문을 보면 추가 사후 처리를 위해 날짜 범위를 백엔드로 보내고 싶다는 것이 분명합니다.

데이터가 특정 형식 일 것으로 예상되는 표준 데이터 지침을 준수한다고 가정합니다. 예를 들어, 날짜 시간 객체의 형식이 다음과 같은 RESTfull API 인 ODATA를 사용합니다.

YYYY-MM-DDT00 : 00 : 00.

아래의 스 니펫을 통해 쉽게 얻을 수 있습니다 (필요에 따라 형식을 변경하십시오).

var mydate;//assuming this is my date object which I want to expose var UTCDateStr = mydate.getUTCFullYear() + "-" + mydate.getUTCMonth() + "-" + mydate.getUTCDate() + "T00:00:00";

반면에, 귀하는 백엔드로부터 날짜를 수신 한 브라우저가 해당 날짜를 현지 날짜로 변환하는 상황에 처해 있습니다. 반면에 UTC 날짜에 관심이 있다면 다음을 수행 할 수 있습니다.

var mydate;//assuming this is my date object which I want to expose var UTCDate = new Date(mydate);/*create a copy of your date object. Only needed if you for some reason need the original local date*/ UTCDate.setTime(UTCDate.getTime() + UTCDate.getTimezoneOffset() * 60 * 1000);

위의 코드 스 니펫은 기본적으로 시간대를 기준으로 브라우저가 추가 / 빼는 시간을 더하거나 뺍니다.

예를 들어 EST (GMT-5)에 있고 내 서비스가 날짜 시간 객체를 반환하면 2016 년 8 월 17 일 수요일 00:00:00 GMT-0500 브라우저가 현지 시간을 얻기 위해 시간대 오프셋 (5 시간)을 자동으로 뺍니다. 시간을 가져 오려고하면 2016 년 8 월 16 일 수요일 19:00:00 GMT-0500을받습니다. 이로 인해 많은 문제가 발생합니다. 분명히 이것을 쉽게 할 수있는 많은 라이브러리가 있지만 순수한 JS 접근법을 공유하고 싶었습니다.

자세한 내용은 http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/를 참조하십시오 . 영감.

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


1

이 메소드는 다음을 제공합니다. 영역 변수를 2017-08-04T11:15:00.000+04:30무시 하여 간단히 얻을 수 있습니다.2017-08-04T11:15:00.000

function getLocalIsoDateTime(dtString) {
    if(dtString == "")
        return "";
    var offset = new Date().getTimezoneOffset();
    var localISOTime = (new Date(new Date(dtString) - offset * 60000 /*offset in milliseconds*/)).toISOString().slice(0,-1);
    //Next two lines can be removed if zone isn't needed.
    var absO = Math.abs(offset);
    var zone = (offset < 0 ? "+" : "-") + ("00" + Math.floor(absO / 60)).slice(-2) + ":" + ("00" + (absO % 60)).slice(-2);
    return localISOTime + zone;
}

1

모멘트 패키지를 사용하면 UTC 날짜 문자열을 새로운 Date 객체로 쉽게 변환 할 수 있습니다.

const moment = require('moment');
let b = new Date(moment.utc('2014-02-20 00:00:00.000000'));
let utc = b.toUTCString();
b.getTime();

이것은 서버가 시간대를 지원하지 않고 UTC 날짜를 항상 서버에 저장하고 새 Date 객체로 다시 가져 오려는 경우에 특히 유용합니다. 위의 코드는이 스레드와 비슷한 문제에 대한 요구 사항을 해결했습니다. 다른 사람을 도울 수 있도록 여기에 공유하십시오. 나는 어떤 대답에서도 정확히 위의 해결책을 보지 못합니다. 감사.


4
이것이 질문에 대답 할 수는 있지만 코드에 대한 설명은 없습니다. 하고있는 일에 대한 설명을 제공하려면 답변을 업데이트하십시오. 감사!
Miroslav Glamuzina


0

나는이 질문이 오래되었다는 것을 알고 있지만이 같은 문제를보고 있었고 한 가지 옵션은 대신 date.valueOf ()를 서버에 보내는 것입니다. javascript Date의 valueOf () 함수는 1970 년 1 월 1 일 자정 (UTC) 이후 밀리 초 수를 보냅니다.

valueOf ()


0

그래서 이것은 날짜로 조작하기 위해 JavaScript 날짜 객체를 원했기 때문에 불행히도 많은 답변을 필요로하기 때문에 문자열로 이동해야하기 때문에이 작업을 수행해야합니다.

//First i had a string called stringDateVar that i needed to convert to Date
var newDate = new Date(stringDateVar)

//output: 2019-01-07T04:00:00.000Z
//I needed it 2019-01-07T00:00:00.000Z because i had other logic that was dependent on that 

var correctDate = new Date(newDate.setUTCHours(0))

//This will output 2019-01-07T00:00:00.000Z on everything which allows scalability 

0

원사 추가 순간

import moment from 'moment';

//local Js date to UTC using moment
const utcDate = moment.utc(moment(new date()).format('YYYY-MM-DDTHH:mm:ss')).valueOf();
console.log('UTC Date', utcDate);


// UTC to local date without moment
const localDate = convertUTCDateToLocalDate(new Date(utcDate))
console.log('UTC Date', moment(localDate).format('MMM D, YYYY HH:mm'));


function convertUTCDateToLocalDate(date) {

   let newDate = new Date(date.getTime() + date.getTimezoneOffset()*60*1000);

   const offset = date.getTimezoneOffset() / 60;
   const hours = date.getHours();

   newDate.setHours(hours - offset);

   return newDate;

}


-8

더 간단한

myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);

2
이것은 불완전합니다. 포함하지 않은 setTime에 의존합니다 new Date. 답변을 완료하십시오.
random_user_name

이 남자는 아직 살아 있습니까? 왜 우리에게 돌아와서 무언가를 말하거나 답을 편집하지 않겠습니까?
희망없는
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.