특정 시간대의 날짜 형식


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.