특정 시간대의 날짜 형식


177

Moment.js 를 사용하여 웹 앱에서 날짜를 구문 분석하고 형식을 지정하고 있습니다. JSON 객체의 일부로 백엔드 서버는 UTC 시대 (Unix 오프셋)에서 날짜를 밀리 초 단위로 보냅니다.

특정 시간대에서 날짜 구문 분석 하는 것은 쉽습니다. 구문 분석하기 전에 문자열 끝에 RFC 822 시간대 식별자를 추가하십시오.

// response varies according to your timezone
const m1 = moment('3/11/2012 13:00').utc().format("MM/DD HH:mm")

// problem solved, always "03/11 17:00"
const m2 = moment('3/11/2012 13:00 -0400').utc().format("MM/DD HH:mm")

console.log({ m1, m2 })
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

그러나 특정 시간대에서 날짜 어떻게 형식화 합니까?

브라우저의 현재 시간에 관계없이 일관된 결과를 원하지만 UTC로 날짜를 표시하고 싶지 않습니다.


2
Moment는 아직이 기능을 지원하지 않지만 현재 작업 중입니다. github.com/timrwood/moment/pull/671
Ben

5
이것은 작동해야합니다. 원하는 오프셋이 포함 된 시간 문자열을 모멘트에 전달하면 브라우저 로컬 시간으로 자동 조정되는 대신 해당 오프셋을 유지하고 지정된대로 현지 시간을 표시해야합니다. 브라우저 로컬 시간으로 조정하려면 명시 적으로 오프셋을 제공하는 대신 UTC 시간을 지정하십시오. 내 말은 ... 나는 그것을 명백한 오프셋을 준다. 왜 기본적으로 그것을 먹고 브라우저 오프셋으로 자체 변환 하는가? 끔찍한 디자인.
Triynko

@Triynko 오프셋은 일광 절약 시간이 적용되므로 항상 예상대로 작동하지는 않습니다.
pinkpanther

1
이와 관련하여 2018 년 3 월 15 일과 같은 특정 형식으로 시간을 인쇄하고 싶지만 형식 문자열을 찾을 수 없습니다. DD MMM, YYYY내가 그것을 사용할 때 제네릭 은 작동하지 않습니다 moment.tz("2018-02-15T14:20:00.000+0530", "Asia/Bangkok").format("DD MMM, YYYY"). 이 API를 사용할 때 시간 형식에 대한 모든 키를 찾을 수있는 문서에서 누군가 나를 가리킬 수 있습니까?
pRmdk

@PramodKumar 무엇이 잘못 되었나요? 그게 제공합니다 "15 Feb, 2018". 형식 문자열 DD MMMM, YYYY을 사용 하여 얻으려고 "15 February, 2018"했습니까?
quietmint

답변:


248

에서 지적 Manto의의 대답 , .utcOffset()순간 2.9.0의로 선호하는 방법입니다. 이 함수는 리버스 오프셋이 아닌 UTC의 실제 오프셋을 사용합니다 (예 : DST 중 뉴욕의 경우 -240). "+0400"과 같은 오프셋 문자열은 이전과 동일하게 작동합니다.

// always "2013-05-23 00:55"
moment(1369266934311).utcOffset(60).format('YYYY-MM-DD HH:mm')
moment(1369266934311).utcOffset('+0100').format('YYYY-MM-DD HH:mm')

오래된 .zone()세터로이 되었다 되지 Moment.js 2.9.0에서. 시간대 식별자 (예 : -4 시간 동안 "-0400"또는 "-04 : 00")가 포함 된 문자열 또는 UTC 보다 분을 나타내는 숫자 (예 : DST 중 뉴욕의 경우 240)를 허용했습니다.

// always "2013-05-23 00:55"
moment(1369266934311).zone(-60).format('YYYY-MM-DD HH:mm')
moment(1369266934311).zone('+0100').format('YYYY-MM-DD HH:mm')

숫자 오프셋 대신 명명 된 시간대로 작업하려면 순간 시간대를 포함 하고 .tz()대신 사용하십시오.

// determines the correct offset for America/Phoenix at the given moment
// always "2013-05-22 16:55"
moment(1369266934311).tz('America/Phoenix').format('YYYY-MM-DD HH:mm')

"TypeError : Object 240에는 'format'메서드가 없습니다."오류가 발생하여 문제가 발생했습니다. 영역이 버전 2.1.0 및 Moment.js 이상에서만 설정 가능하다는 것을 깨달았습니다 (그리고 나는 이전 버전이었습니다). 감사!
Melinda Weathers

5
@ebi 이미 기본적으로 브라우저의 시간대를 사용합니다. 브라우저의 시간대 오프셋에 액세스 하려면 .zone()UTC에서 분을 반환하는 게터로 사용하십시오 (예 : 표준 시간 동안 뉴욕의 경우 300을 반환 함).
quietmint

1
@EricCope 아뇨. 그러나 momentjs.com/timezone 도 포함하면 사용할 수 있습니다 . 예를 들어 답변을 업데이트했습니다. .tz("America/Phoenix")
quietmint

1
일광 절약 시간 제로 인해 시간대에 다른 오프셋이있는 경우 오프셋을 사용하면 예상대로 작동하지 않습니다.
pinkpanther

1
.utcOffset ()은 일광 절약 시간을 자동으로 관리합니까? 겨울에 UTC +1 CET을 설정하면 일광 절약 시간 동안 UTC +2 CEST가 베팅됩니까? 이로 인해 사용 가능 여부가 결정됩니다!
haemse

61

사용 순간 시간대

moment(date).tz('Europe/Berlin').format(format)

특정 시간대에 액세스하려면 먼저 시간대를로드해야합니다 (또는 여기에 설명 된 대체 방법 사용 ).

moment.tz.add('Europe/Berlin|CET CEST CEMT|-10 -20 -30')

질문을 받았을 때 tz를 사용할 수 있다고 생각하지 않지만 이것이 갈 길이라고 생각합니다. 현재 MySQL에서 UTC로 저장된 모든 타임 스탬프와 비슷한 문제를 겪고 있지만 클라이언트의 시간대가 아닌 사용자 구성에 따라 특정 영역에서 볼 수 있습니다.
nickdnk

47

몇 가지 답변은 이미 모멘트 시간대가 명명 된 시간대와 함께 갈 수있는 방법이라고 언급합니다. 나는이 라이브러리에 대해 나에게 꽤 혼란 스러웠던 것을 분명히하고 싶습니다. 이 두 문장 사이에는 차이점이 있습니다.

moment.tz(date, format, timezone)

moment(date, format).tz(timezone)

전달 된 날짜에 시간대가 지정되지 않은 경우 :

첫 번째 코드는 날짜를 가져 와서 시간대가 전달 된 것으로 가정합니다. 두 번째 코드는 날짜를 가져 와서 브라우저에서 시간대를 가정 한 다음 전달 된 시간대에 따라 시간과 시간대를 변경합니다.

예:

moment.tz('2018-07-17 19:00:00', 'YYYY-MM-DD HH:mm:ss', 'UTC').format() // "2018-07-17T19:00:00Z"

moment('2018-07-17 19:00:00', 'YYYY-MM-DD HH:mm:ss').tz('UTC').format() // "2018-07-18T00:00:00Z"

내 시간대는 utc에서 +5입니다. 따라서 첫 번째 경우에는 변경되지 않으며 utc 시간대를 갖도록 날짜와 시간을 설정합니다.

두 번째 경우, 전달 된 날짜가 -5에 있다고 가정 한 다음 UTC로 변환하여 "2018-07-18T00 : 00 : 00Z"날짜를 내뿜는 이유입니다.

참고 : 형식 매개 변수는 정말 중요합니다. 생략 된 순간이 예측할 수없는 동작을 수행 할 수있는 Date 클래스로 대체 될 수 있음


시간대가 다음과 같이 전달 된 날짜로 지정되었다고 가정합니다.

이 경우 둘 다 동일하게 동작합니다


지금은 왜 그런 식으로 작동하는지 이해하지만 이것이 혼란스럽고 설명 할 가치가 있다고 생각했습니다.


1
moment (...). tz는 함수가 아닙니다.
K-SO의 독성이 증가하고 있습니다.

5
순간 시간대를 설치 했습니까?
니콜라 페드레티

포맷하지 않고 구문 분석하고 변환 된 순간을 되돌릴 수있는 방법이 있습니까? 예를 들어, 다시 구문 분석하지 않고 다른 방법으로 서식을 지정하려는 경우.
jEremyB

이것을 명확히 해 주셔서 감사합니다-사용자의 브라우저 시간대와 다른 시간대를 설정할 때 문제가 발생했으며 이것이 정확한 문제였습니다.
로빈 샤프

20

.zone ()은 더 이상 사용되지 않으며 대신 utcOffset을 사용해야합니다.

// for a timezone that is +7 UTC hours
moment(1369266934311).utcOffset(420).format('YYYY-MM-DD HH:mm')

8

Moment.js와 같은 문제가있었습니다. 순간 시간대를 설치했지만 문제가 해결되지 않았습니다. 그런 다음 여기에 노출 된 것을 수행하고 시간대를 설정하면 매력처럼 작동합니다.

moment(new Date({your_date})).zone("+08:00")

고마워요!


16
new Date()생성자를 사용하지 않아야합니다 . 모멘트는 날짜를 구문 분석하는 데 필요한 모든 것을 제공합니다. 문서 파싱을 참조하십시오 .
quietmint

내가 그렇게하지 않으면 네,하지만, 나는 그것이 같은 뭔가되지 않습니다 것을, 순간에서 경고를 수신하고
facundofarias

7
경고는 Moment가 내부적으로 사용중인 작업으로 내부적으로 떨어지고 있음을 의미 new Date()하지만 브라우저간에 일관성없습니다 . 대신 두 번째 인수로 예상 형식을 제공해야합니다. 예 : moment("12-25-1995", "MM-DD-YYYY").
quietmint

4

방금이 문제가 발생했고 같은 문제가 발생했기 때문에 내가 찾은 결과를 게시했습니다.

구문 분석 할 때 오프셋을 업데이트 할 수 있습니다 (예 : 데이터 구문 분석 중 (1.1.2014). 2014 년 1 월 1 일 날짜 만 원합니다. GMT + 1에서는 31.12.2013을 얻으므로 먼저 값을 오프셋하십시오.

moment(moment.utc('1.1.2014').format());

글쎄, 내가 시간대에 걸쳐 지원하는 데 편리했다


-7

당신은 이것을 시도 할 수 있습니다,

여기서 클라이언트 시간대 (브라우저)를 기준으로 날짜를 얻을 수 있습니다.

moment(new Date().getTime()).zone(new Date().toString().match(/([-\+][0-9]+)\s/)[1]).format('YYYY-MM-DD HH:mm:ss')

정규식은 기본적으로 오프셋 값을 가져옵니다.

건배!!


일반적으로 순간은 필요한 모든 것을 제공합니다. 사용자 정의와 일치시킬 필요가 없습니다.
Mahesh Samudra
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.