Moment.js를 날짜 객체로 변환


696

Moment.js를 사용하면 올바른 순간 객체를 시간대가있는 날짜 객체로 변환 할 수 없습니다. 정확한 날짜를 알 수 없습니다.

예:

var oldDate = new Date(),
    momentObj = moment(oldDate).tz("MST7MDT"),
    newDate = momentObj.toDate();
console.log("start date " + oldDate)
console.log("Format from moment with offset " + momentObj.format())
console.log("Format from moment without offset " + momentObj.utc().format())
console.log("(Date object) Time with offset " + newDate)
console.log("(Date object) Time without offset "+ moment.utc(newDate).toDate())

1
어떤 결과를 기대하고 어떤 결과를 얻습니까?
Felix Kling

4
<code> (날짜 개체) 오프셋이있는 시간 Thu Aug 01 2013 15:23:49 GMT + 0300 (Финляндия (лето)) </ code> 그러나 시간대는 MST7MDT 여야합니다
vadim.zhiltsov

Wednesday 24th 2019, 12:47:48 am이로 변환 할 수 2019-04-23T19:17:48.000Z 있습니까? @ vadim.zhiltsov
Anupam Maurya

날짜 객체에는 시간대가 없으며 1970-01-01T00 : 00 : 00Z와의 오프셋입니다. 따라서 toate 를 호출 하면 반환 된 객체가에 모멘트 객체에 첨부 한 시간대 정보가 손실됩니다 .tz("MST7MDT"). 그렇기 때문에 UTC와 호스트 시간대 만 이해하는 내장 Date 객체의 기본 기능을 보완하기 위해 moment.tz와 같은 라이브러리가 존재합니다.
RobG

답변:


1236

이것을 사용하여 순간 객체를 날짜 객체로 변환하십시오.

에서 http://momentjs.com/docs/#/displaying/as-javascript-date/

moment().toDate();

수율 :

Tue Nov 04 2014 14:04:01 GMT-0600 (CST)

11
@Spencer-예, 제목에 대답하고 toDate실제로에서 Date객체 를 얻는 방법 moment입니다. 그러나 질문 본문의 코드는 시간대 변환에 ​​대해 묻습니다 Date. Mountain time이 실제로 사용자의 시간대가 아닌 한, 이것이 어떻게 질문에 대답했는지 확실하지 않습니다.
Matt Johnson-Pint

1
@ 매트 그것은 당신이보고있는 질문의 어느 부분에 달려 있습니다. 대다수의 사람들이 Google을 검색하여이 제목이 질문과 일치하고 질문의 본문이 아니라 제목에 대한 답변을 찬성하는 것을 알 수 있습니다. 기술적으로 OP에 도움이되지 않더라도 이것이 가장 많이지지되는 이유를 설명 할 수 있습니다.
스펜서

14
이것이 실제로 정답입니까? 문제는 TIMEZONE을 사용하여 순간 객체를 자바 스크립트 날짜로 변환하는 방법이었습니다. javascript 날짜 객체로 변경하면 여전히 현지 시간대로 되돌아갑니다.
말할 수없는

1
안녕하세요,이 링크 momentjs.com/guides/#/warnings/js-date 확인하십시오 . 이것은 권장되지 않으며 향후 주요 릴리스에서 제거 될 예정입니다.
gtzinos

3
@gtzinos 당신이 연결하고 참조하는 것은 별도의 문제와 시나리오입니다. 예를 들어 순간 생성자에 문자열을 전달하면 moment("12/12/2011")메시지를 얻을 수 있습니다. 그것은 objmoment().toDate()
btbJosh

51

원하는 대한 데이터를 사용 하여 모멘트 시간대 를 초기화 하면 코드가 예상대로 작동합니다.

모멘트를 표준 시간대로 올바르게 변환하고 있습니다.이 표준 시간대는의 두 번째 출력 행에 반영됩니다 momentObj.format().

UTC로 전환하면 오프셋 만 삭제하는 것이 아니라 UTC 시간대로 다시 변경됩니다. 그렇게하려면 원래 .tz()전화 가 전혀 필요하지 않습니다 . 당신은 할 수 있습니다 moment.utc().

아마도 출력 형식 문자열을 변경하려고합니까? 그렇다면 format메소드에 원하는 매개 변수를 지정하십시오 .

momentObj.format("YYYY-MM-DD HH:mm:ss")

코드의 마지막 줄과 관련하여-를 Date사용하여 객체 로 돌아갈 때 toDate()moment.js의 동작을 포기하고 JavaScript의 동작으로 돌아갑니다. JavaScript Date개체는 항상 실행중인 컴퓨터의 현지 시간대로 인쇄됩니다. 그것에 대해 moment.js가 할 수있는 일은 없습니다.

다른 작은 것들 :

  • 순간 생성자는 동안 Date, 그것은 하나를 사용하지 않는 것이 가장 좋습니다. "지금"의 경우을 사용하지 마십시오 moment(new Date()). 대신을 사용하십시오 moment(). 둘 다 작동하지만 불필요하게 중복됩니다. 문자열에서 구문 분석하는 경우 해당 문자열을 바로 전달하십시오. Date처음 으로 구문 분석하지 마십시오 . 당신은 순간의 파서를 훨씬 더 신뢰할 수 있습니다.

  • MST7MDT이전 버전과의 호환성을 위해 시간대 가 있습니다. POSIX 스타일 시간대에서 비롯되며 TZDB 데이터에는 몇 개만 있습니다. 꼭 필요한 경우가 아니라면와 같은 키를 사용해야합니다 America/Denver.


고마워 매트! 당신의 대답은 유용했습니다. MST7MDT 대신 America / Denver 사용에 대해 언급했듯이 이러한 매핑에 사용할 수있는 맵이 있습니까? CET, EET, EST5EDT, CST6CDT, PST8PDT와 같은 시간대를 사용하고 있습니다.
monish001

예를 들어 "10:20 AM"(모멘트 시간 (moment (). format ( 'hh : mm A')에서 Date object로))
ram

2
@ram-1) 순간이 있다면을 사용하십시오 .toDate(). 2) 새로운 질문을하기 위해 의견을 사용하지 마십시오. 이것이 바로 "질문하기" 버튼이 큰 의미 입니다.
Matt Johnson-Pint

22

.toDate 나를 위해 실제로 작동하지 않았으므로 여기에 내가 한 일이 있습니다.

futureStartAtDate = new Date(moment().locale("en").add(1, 'd').format("MMM DD, YYYY HH:MM"))

도움이 되었기를 바랍니다


2
이 답변은 질문에 대한 답변이 아닙니다. 코드는 긴 글쓰기 방식입니다 moment().add(1, 'd').toDate().
RobG

12

momentjs는 자바 스크립트 날짜 객체를 제어 할 수 없으므로이 문제를 해결했습니다.

const currentTime = new Date();    
const convertTime = moment(currentTime).tz(timezone).format("YYYY-MM-DD HH:mm:ss");
const convertTimeObject = new Date(convertTime);

이렇게하면 변환 된 시간이있는 자바 스크립트 날짜 객체가 제공됩니다


2
이것은 질문에 직접 대답하는 유일한 정답입니다.
Anish Sana

1
이것이 바로 내가 원하는 것입니다. 기본 날짜가 표준 시간대를 올바르게 나타낼 것으로 예상했지만 슬프게 잘못되었습니다.
mklbtz 2016

1
Safari에서는 "YYYY-MM-DD HH : mm : ss"형식을 지원하지 않으므로 결과는 null 입니다. 형식은 "YYYY-MM-DDTHH : mm : ss"여야합니다 (ECMAScript 지원 형식, 날짜와 시간 부분 사이의 "T"사용).
RobG

4

날짜 문자열에 시간대 정보가 필요했습니다. 원래 사용하고 moment.tz(dateStr, 'America/New_York').toString();있었지만 해당 문자열을 다시 공급하는 데 오류가 발생하기 시작했습니다.

나는 노력 moment.tz(dateStr, 'America/New_York').toDate();했지만 시간대 정보를 잃어 버렸다.

시간대 로 사용할 수있는 날짜 문자열을 반환 한 유일한 솔루션은 순간으로 피드백 될 수있었습니다.moment.tz(dateStr, 'America/New_York').format();


4
let dateVar = moment('any date value');
let newDateVar = dateVar.utc().format();

좋고 깨끗합니다 !!!!


이것이 내 경우에는 utc 형식으로 작동하는 유일한 솔루션이었습니다. 감사합니다
Luis Febro

3

날짜를 변환하려면 (예 : utc)

moment( moment().utc().format( "YYYY-MM-DD HH:mm:ss" )).toDate()

2
이것은 나의 하루를 정말로 구했다!
HV 샤르마

이 답변은 잘못되었습니다. 표준 시간대 오프셋을 두 번 적용합니다. moment().utc()UTC 값을 .format( "YYYY-MM-DD HH:mm:ss" )반환 한 다음 표준 시간대 오프셋없이 UTC로 설정된 문자열 을 반환하므로 로컬로 구문 분석됩니다. 기본 모멘트 형식과 일치하지 않으므로 내장 구문 분석기로 구문 분석됩니다. ECMAScript 지원 형식과도 일치하지 않으므로 구문 분석은 구현에 따라 다릅니다. 어쨌든, 로컬로 구문 분석되므로 날짜 시간 값을 작성할 때 시간대 오프셋이 다시 적용됩니다.
RobG

3

문제는 조금 모호하다. 이것을 설명하기 위해 최선을 다하겠습니다. 먼저 moment-timezone 사용법을 이해해야합니다 . 이 답변에 따르면 TypeError : moment (). tz는 함수가 아니므로 기본 순간 대신 순간 시간대 에서 순간 을 가져와야합니다 (물론 npm을 먼저 설치해야합니다! 명확성을 위해

const moment=require('moment-timezone')//import from moment-timezone

시간대 기능을 사용하려면 moment.tz ( "date_string / moment ()", "time_zone")를 사용하십시오 ( 자세한 내용 은 https://momentjs.com/timezone/ 을 방문 하십시오). 이 함수는 특정 시간대를 가진 모멘트 객체를 반환합니다. 명확성을 위해

var newYork= moment.tz("2014-06-01 12:00", "America/New_York");/*this code will consider NewYork as the timezone.*/

이제 moment의 toDate () (ISO 8601 형식 변환) 로 newYork (모멘트 객체)를 변환하려고하면 영국 그리니치 시간이 표시됩니다. 자세한 내용 은 UTC에 관한 https://www.nhc.noaa.gov/aboututc.shtml 기사를 참조하십시오 . 그러나이 형식에 따라 현지 시간을 원한다면 (이 예제에 따르면 뉴욕 시간 ) arg true 와 함께 .utc (true) 메소드 를 moment 객체에 추가하십시오. 명확성을 위해

newYork.toDate()//will give you the Greenwich ,UK, time.

newYork.utc(true).toDate()//will give you the local time. according to the moment.tz method arg we specified above, it is 12:00.you can ofcourse change this by using moment()

요컨대, moment.tz 는 지정한 시간대를 고려하고 현지 시간을 그리니치 시간과 비교하여 결과를 제공합니다. 이것이 도움이 되었기를 바랍니다.


2

moment는 2018 년 6 월 6 일자로 js lib를 업데이트했습니다.

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london     = newYork.clone().tz("Europe/London");

newYork.format();    // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format();     // 2014-06-01T17:00:00+01:00

Angular5 +를 자유롭게 사용할 수 있다면 여기에서 시간대 기능보다 datePipe 기능을 사용하는 것이 좋습니다. 내 프로젝트가 Angular2로 제한되기 때문에 moment.js를 사용해야합니다.


1

( format단계 없이 ) 시도

new Date(moment())


new Date(moment())와 같습니다 new Date(). 시간대는 d 로만 설정됩니다 .
RobG
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.