[javascript] 특정 시간대의 날짜 형식

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로 날짜를 표시하고 싶지 않습니다.



답변

에서 지적 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')


답변

사용 순간 시간대

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

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

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


답변

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

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 클래스로 대체 될 수 있음


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

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


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


답변

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

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


답변

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

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

고마워요!


답변

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

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

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

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


답변

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

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

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

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

건배!!