본문으로 건너뛰기

JS 날짜 시간 문자열 형식

무료2016-10-01#JS#JS日期字符串#JS日期格式化#JavaScript date string#js date format

가장 호환성이 좋은 날짜 시간 문자열 형식, ES5.1 표준 날짜 시간 문자열 형식, 절대 사용하면 안 되는 날짜 시간 문자열 형식

一.new Date()

据说有 4 가지 방법이 있습니다:

new Date();
new Date(value);
new Date(dateString);
new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]);

첫 번째 방법은 타임스탬프를 가져오는 데 사용:

// get ts
var now = Date.now || function() {
    return new Date().getTime();
};

두 번째 방법은 타임스탬프를 Date 객체로 변환:

// ts to Date
var ts2Date = function(ts) {
    return new Date(ts);
};

세 번째 방법은 날짜 시간 문자열을 Date 객체로 변환:

// string to Date
// eg.  '2016/10/01 12:01:02'
//      '2016/10/01'
var str2Date = function(str) {
    return new Date(str);
};

네 번째 방법은 일반적으로 사용하지 않습니다. 네 번째 방법에는 매우 성가신 문제가 있기 때문입니다 (month0-11):

// set Date
// eg.  2016, 9, 1, 12, 1, 2
//      2016, 9, 1
var setDate = function(y, m, d, h, mm, s, ms) {
    return new Date(y, m, d, h, mm, s, ms);
};
// getter/setter 中,month 는 0-11
var date = new Date();  // 오늘은 2016-10-01
date.getMonth();    // 9
date.setMonth(10);
date.toString();    // Tue Nov 01 2016 11:46:58 GMT+0800 (China Standard Time)

네 번째 ��법 내부에서는 아마도 setter 를 사용하기 때문에, month0 부터 시작합니다

비교적으로 유용한 것은 세 번째 방법입니다. 일반적으로 처리해야 할 날짜 문자열은 ISO 표준 형식이기 때문입니다. 예를 들어 2016-10-01 12:01:02 하지만, 이는 JS 에서비표준적입니다

二.날짜 시간 문자열 형식

비표준 형식

먼저 이 두 가지를 살펴봅시다:

// new 一个 0 区时间
new Date('2016-10-01'); // Sat Oct 01 2016 08:00:00 GMT+0800 (China Standard Time)
// new 一个当前时区时间
new Date('2016/10/01'); // Sat Oct 01 2016 00:00:00 GMT+0800 (China Standard Time)

두 번째가 정확하고, 첫 번째는8 시간이 많습니다. 브라우저는 첫 번째传入的是 0 区 시간으로 판단하고, 동팔구 사용자를 위해勝手に 8 시간을 추가했습니다. 각각 다음과 동치입니다:

// Sat Oct 01 2016 08:00:00 GMT+0800 (China Standard Time)
new Date('01 October, 2016 GMT+0000');
// Sat Oct 01 2016 00:00:00 GMT+0800 (China Standard Time)
new Date('01 October, 2016 GMT+0800');

따라서, 절대 사용하면 안 됩니다yyyy-MM-dd.たとえ 매우 확실히 0 区 시간을 new 하고 싶더라도, 이렇게 해서는 안 됩니다. 다른 사람이 이해하지 못할 수 있기 때문입니다. 정말로 0 区 시간을 new 하고 싶다면, 그 등가 형식 (GMT 타임존 식별자가 있는 것) 을 사용해야 합니다

시간 'HH:mm:ss' 를 추가하여 다시 시도:

// new 一个 0 区时间
// Sat Oct 01 2016 12:01:02 GMT+0800 (China Standard Time)
new Date('2016-10-01 12:01:02');
// new 一个当前时区时间
// Sat Oct 01 2016 12:01:02 GMT+0800 (China Standard Time)
new Date('2016/10/01 12:01:02');

竟然 일치했습니다. 그러나, Safari(IOS Safari 포함) 는yyyy-MM-dd HH:mm:ss 형식을 지원하지 않습니다. Safari 는 시작부터 현재 (2016-10-01) 까지 이 형식을 지원하지 않았습니다. 비규범적이기 때문에, 지원할 계획이 없을 수 있습니다

yyyy/MM/dd HH:mm:ss 도 비규범적이지만, 역사가 길기 때문에, IE6 를 포함한 모든 브라우저가지원합니다

따라서, 널리 지원되는 비표준 형식은 두 가지가 있습니다:

// eg. 2016/10/01 12:01:02
yyyy/MM/dd HH:mm:ss
// eg. 01 October, 2016 12:01:02 GMT+0800
week, dd month yyyy HH:mm:ss GMT±HHmm

전자는 기본적으로 현재 타임존 시간, 후자는 타임존을 설정할 수 있습니다

표준 형식

ES5.1 15.9.1.15 Date Time String Format 까지 날짜 문자열의 형식 표준이 없었습니다:

// 0 区 시간
YYYY-MM-DDTHH:mm:ss.sssZ
// 東边 시간
YYYY-MM-DDTHH:mm:ss.sss+HH:mm
// 西边 시간
YYYY-MM-DDTHH:mm:ss.sss-HH:mm

이 사양은 2011 년 6 월의 것입니다. 따라서, 호환성 은 상상한 대로입니다. 모양은 상당히 이상하지만, 표준을 준수하는 Safari 는 지원합니다. 예를 들어:

// 0 区 시간
// Sat Oct 01 2016 20:01:02 GMT+0800 (CST)
new Date('2016-10-01T12:01:02Z')
// 東 8 区 시간
// Sat Oct 01 2016 12:01:02 GMT+0800 (CST)
new Date('2016-10-01T12:01:02+08:00')

마찬가지로, 0 区 시간에는勝手に 타임존 오프셋이 추가됩니다. 따라서, 이 두 가지를 쉽게 생각할 수 있습니다:

new Date('2016-10-01T12:01:02+00:00')
new Date('2016-10-01T12:01:02-00:00')

이들은 모두 Z 와 동치이며, 마찬가지로 로컬라이즈 오프셋됩니다

三.GMT 와 UTC

일반적으로 이 두 가지는 같은 것으로 간주할 수 있습니다. 모두 세계 표준 시간을 나타냅니다. 베이징은 동팔구에 위치하므로:

// 일반적으로 생각할 수 있음
베이징시간 === UTC+8 === GMT+8

UTC 와 GMT 는 타임존의 개념상 일치하지만, UTC 는 정밀도를 강조하며, 오차가 더 작습니다. 이 오차는 UT 에 대한 상대적인 것입니다

GMT

GMT(Greenwich Mean Time 그리니치 표준시) 는 최초로 정의된 세계 시간입니다. 1884 년, 각국 대표가 워싱턴에 모여 회의를 열고, 타임존에 대해 합의에 도달했습니다. 본초 자오선을 중심으로 하며 (0 구에 위치), 동쪽에 1 에서 11 구, 서쪽에 1 에서 11 구, 합쳐서 12 구 (「동서 12 구」라고 함), 총24 개의 타임존 입니다

0 구에서 표준 시간을 발표하고, 다른 구는 해당하는 오프셋량을 더해 로컬 시간을 가져옵니다

UT

UT(Universal Time 세계시) 는 천체 관측을 기반으로 계산된 시간입니다. UT 자체는 넓은 개념이며, 그下に UT0, UT1, UT2 등이 포함됩니다. 그 중에서 UT0 는 완전히 천체의 운행을 기반으로 계산된 시간이며, UT1 은 UT0 의基础上에서 몇 가지 조정을 수행하고, UT2 는 UT0 와 UT1 의基础上에서 다시 몇 가지 조정을 수행했습니다. 천체의 운행에는 몇 가지 불확실성이 있기 때문에 (예를 들어 지구의 자전은 등속이 아니며, 복잡한 방식으로 가속과 감속을 수행합니다), UT 시간은 균일하게 흐르지 않습니다.

UT 는 이론상의 「올바른」시간입니다

UTC

UTC(Universal Time Coordinate 협정 세계시) 는 원자 시계를 기반으로 한 시간입니다. 원자 시계란 무엇인가? 개인적으로는 매우 작고, 길이가 고정되어 있으며, 더 이상 분할할 수 없는 시간 세그먼트라고 생각합니다. 따라서 UTC 의 시간은 균일합니다. UT 시간과의 오차를 가능한 한 작게 하기 위해, UTC 는 윤초를 도입했습니다 (어떤 해의 마지막 1 분이 61 초가 됨),以确保 UTC 와 UT1 사이의 오차가 0.9 초 이내가 되도록 합니다.

UTC 는 GMT 의 타임존 개념을 인정하므로, UTC 는 GMT 에 더 고급 시계를 갈아끼운 것과 같으며, GMT 가 어떤 시계를 사용하는지는 알 수 없습니다

四.잠재적인 문제

베이징 시간과 가장 차이가 큰 것은 서 12 구 (몇 개의 작은 섬만 있음) 입니다:

deltaH = (+8) - (-12) = 20

로컬 시간 판단을 만든 경우, 예를 들어:

if (new Date() > new Date('2016/10/02')) {
    alert('a new day');
}

다른 타임존의 사용자는 모두, 손안의 기기에서 2016 년 10 월 2 일 0 시 0 분 0 밀리초 외를 표시했을 때 a new day 를 봅니다. 이는 문제가 없습니다. 그러나, 시나리오가 이 경우:

if (new Date() > new Date('2016/10/02')) {
    alert('考试时间到,3 秒后回到首页');
    setTimeout(function() {
        location.href = '/index.html';
    }, 3000);
}

여기서 문제가 커집니다. 베이징 시간 2016 년 10 월 2 일 0 시 0 분 0 밀리초 외에서, 시험 상태가 CLOSED 로 변경되고, 제출을 받지 않습니다. 그러면, 다른 타임존에 위치한 사용자는 문제를 발견합니다:

  • 서 12 구에 사는 친구는 아직 20 시간 여유롭게 답안 작성 가능, 제출时发现人家不要

  • 동 12 구에 사는 친구는 더욱 비참하며, 4 시간 일찍 채점되었습니다

물론, 일반적으로는 페이지에 들어가 먼저 서버에 상태를 요청하고, 서버 시간을 기준으로 합니다. 로컬 시간은 신뢰할 수 없기 때문입니다 (사용자는 기기 시간을 자유롭게 변경할 수 있음), 또 다른 이유는 위에서 언급한 대로: 타임존의 차이로 인해다른 타임존에 위치한 사용자 가 혼란스러워하기 때문입니다

따라서,たとえ 로컬 시간 판단을 사용하는 경우에도, 이렇게 해야 합니다:

if (new Date() > new Date('02 October, 2016 GMT+0800')) {
    alert('考试时间到,3 秒后回到首页');
    setTimeout(function() {
        location.href = '/index.html';
    }, 3000);
}

사용자의 로컬 시간과 베이징 시간을 비교합니다. 적어도 사용자 기기 시간의 경우, 상태의 일관성을 보장할 수 있습니다. 물론, 수동으로 시간을 변경하는 문제는 피할 수 없습니다 (예를 들어 이전의 몇 가지 농장 게임은 로컬 시간을 사용했습니다). 따라서, 가능한 한 로컬 시간을 판단 기준으로 하지 마십시오

五.정리

로컬 시간이란기기가 위치한 타임존의 시간 을 가리킵니다

가장 호환성이 좋은 날짜 시간 문자열 형식:

// 타임존을 지원하지 않음
2016/10/01 12:01:02
yyyy/MM/dd HH:mm:ss
// 타임존을 지원
new Date('01 October, 2016 GMT+0800')
week, dd month yyyy HH:mm:ss GMT±HHmm

ES5.1 표준 날짜 시간 문자열 형식:

2016-10-01T12:01:02+08:00
YYYY-MM-DDTHH:mm:ss.sss±HH:mm

절대 사용하면 안 되는 날짜 시간 문자열 형식:

// 호환성은 문제없지만, 강제 오프셋됨. 예를 들어 기기가 베이징이면 +8 시간
yyyy-MM-dd
// Safari 全家都不 지원, IE6-11 都不 지원
yyyy-MM-dd HH:mm:ss

참고 자료

댓글

아직 댓글이 없습니다

댓글 작성