새로운 내장 객체인 Date를 만나보겠습니다. 날짜, 시간을 저장하고 날짜/시간 관리 방법을 제공합니다.
예를 들어 생성/수정 시간을 저장하거나, 시간을 측정하거나, 현재 날짜를 인쇄하는 데 사용할 수 있습니다.
새 Date
객체를 생성하려면 다음 인수 중 하나를 사용하여 new Date()
호출하세요.
new Date()
인수 없이 – 현재 날짜와 시간에 대한 Date
객체를 만듭니다.
이제 = new Date(); 경고(지금); // 현재 날짜/시간을 표시합니다.
new Date(milliseconds)
1970년 1월 1일 UTC+0 이후 경과된 밀리초(1/1000초)와 동일한 시간을 사용하여 Date
객체를 만듭니다.
// 0은 1970년 1월 1일 UTC+0을 의미합니다. Jan01_1970 = 새 날짜(0)를 설정합니다. 경고( Jan01_1970 ); // 이제 24시간을 더하면 1970년 1월 2일 UTC+0이 됩니다. Jan02_1970 = new Date(24 * 3600 * 1000); 경고( Jan02_1970 );
1970년이 시작된 이후 경과된 밀리초 수를 나타내는 정수를 타임스탬프 라고 합니다.
날짜를 간단한 숫자로 표현한 것입니다. new Date(timestamp)
사용하여 언제든지 타임스탬프에서 날짜를 생성하고 date.getTime()
메서드를 사용하여 기존 Date
객체를 타임스탬프로 변환할 수 있습니다(아래 참조).
1970년 1월 1일 이전 날짜에는 음수 타임스탬프가 있습니다. 예:
// 1969년 12월 31일 Dec31_1969 = new Date(-24 * 3600 * 1000); 경고(1969년 12월 31일);
new Date(datestring)
단일 인수가 있고 문자열인 경우 자동으로 구문 분석됩니다. 알고리즘은 Date.parse
사용하는 것과 동일하므로 나중에 다루겠습니다.
let date = new Date("2017-01-26"); 경고(날짜); // 시간이 설정되지 않았으므로 GMT 자정으로 가정하고 // 코드가 실행되는 시간대에 따라 조정됩니다. // 따라서 결과는 다음과 같을 수 있습니다. // 2017년 1월 26일 목요일 11:00:00 GMT+1100(호주 동부 일광 절약 시간) // 또는 // 2017년 1월 25일 수요일 16:00:00 GMT-0800(태평양 표준시)
new Date(year, month, date, hours, minutes, seconds, ms)
현지 시간대로 주어진 구성요소를 사용하여 날짜를 생성합니다. 처음 두 인수만 필수입니다.
year
4자리여야 합니다. 호환성을 위해 2자리 숫자도 허용되고 19xx
로 간주됩니다. 예를 들어 여기서 98
1998
과 동일하지만 항상 4자리 숫자를 사용하는 것이 좋습니다.
month
계산은 0
(1월)부터 시작하여 11
(12월)까지입니다.
date
매개변수는 실제로 월의 날짜이며, 없으면 1
로 간주됩니다.
hours/minutes/seconds/ms
없으면 0
으로 간주됩니다.
예를 들어:
새로운 날짜(2011, 0, 1, 0, 0, 0, 0); // 2011년 1월 1일, 00:00:00 새로운 날짜(2011, 0, 1); // 동일합니다. 시간 등은 기본적으로 0입니다.
최대 정밀도는 1ms(1/1000초)입니다.
날짜 = 새 날짜(2011, 0, 1, 2, 3, 4, 567); 경고( 날짜 ); // 2011.01.01, 02:03:04.567
Date
객체에서 연도, 월 등에 액세스하는 방법이 있습니다.
getFullYear()
연도 가져오기(4자리)
get월()
0에서 11까지 의 월을 가져옵니다.
get날짜()
1부터 31까지 월의 일자를 구하면 메소드 이름이 조금 이상해 보입니다.
getHours(), getMinutes(), getSeconds(), getMilliseconds()
해당 시간 구성 요소를 가져옵니다.
getYear()
가 아니라 getFullYear()
많은 JavaScript 엔진은 비표준 메소드 getYear()
구현합니다. 이 방법은 더 이상 사용되지 않습니다. 때로는 2자리 연도를 반환합니다. 절대로 사용하지 마십시오. 연도에 대한 getFullYear()
가 있습니다.
추가적으로 요일을 얻을 수 있습니다:
getDay()
0
(일요일)부터 6
(토요일)까지의 요일을 가져옵니다. 첫 번째 날은 항상 일요일입니다. 일부 국가에서는 그렇지 않지만 변경할 수 없습니다.
위의 모든 메소드는 현지 시간대를 기준으로 구성요소를 반환합니다.
UTC+0 시간대에 대해 일, 월, 연도 등을 반환하는 UTC 대응 부분도 있습니다: getUTCFullYear(), getUTCMonth(), getUTCDay(). "get"
바로 뒤에 "UTC"
를 삽입하면 됩니다.
현지 시간대가 UTC를 기준으로 이동된 경우 아래 코드는 다른 시간을 표시합니다.
// 현재 날짜 날짜 = 새 날짜()를 설정합니다. // 현재 시간대의 시간 경고(date.getHours()); // UTC+0 시간대의 시간(일광 절약 시간제를 적용하지 않는 런던 시간) 경고(date.getUTCHours());
주어진 방법 외에도 UTC 변형이 없는 두 가지 특별한 방법이 있습니다.
getTime()
날짜(UTC+0) 1970년 1월 1일부터 경과된 밀리초 수에 대한 타임스탬프를 반환합니다.
getTimezoneOffset()
UTC와 현지 시간대의 차이를 분 단위로 반환합니다.
// UTC-1 시간대에 있는 경우 60을 출력합니다. // UTC+3 시간대에 있는 경우 -180을 출력합니다. 경고( new Date().getTimezoneOffset() );
다음 방법을 사용하면 날짜/시간 구성요소를 설정할 수 있습니다.
setFullYear(year, [month], [date])
setMonth(month, [date])
setDate(date)
setHours(hour, [min], [sec], [ms])
setMinutes(min, [sec], [ms])
setSeconds(sec, [ms])
setMilliseconds(ms)
setTime(milliseconds)
(1970년 1월 1일 UTC 이후 전체 날짜를 밀리초 단위로 설정)
setTime()
제외한 모든 것에는 UTC 변형이 있습니다(예: setUTCHours()
.
보시다시피, 일부 메소드는 한 번에 여러 구성요소를 설정할 수 있습니다(예: setHours
. 언급되지 않은 구성 요소는 수정되지 않습니다.
예를 들어:
오늘 = new Date(); today.setHours(0); 경고(오늘); // 오늘도 여전히, 시간은 0으로 변경됩니다. today.setHours(0, 0, 0, 0); 경고(오늘); // 오늘도 여전히, 지금은 정확히 00:00:00입니다.
자동 수정 은 Date
객체의 매우 편리한 기능입니다. 범위를 벗어난 값을 설정하면 자동으로 조정됩니다.
예를 들어:
날짜 = 새 날짜(2013, 0, 32); // 2013년 1월 32일 ?!? 경고(날짜); // ...2013년 2월 1일입니다!
범위를 벗어난 날짜 구성 요소는 자동으로 배포됩니다.
"2016년 2월 28일" 날짜를 2일 늘려야 한다고 가정해 보겠습니다. 윤년인 경우에는 "2 Mar" 또는 "1 Mar"일 수 있습니다. 우리는 그것에 대해 생각할 필요가 없습니다. 2일만 추가하세요. Date
객체가 나머지 작업을 수행합니다.
날짜 = 새 날짜(2016, 1, 28); date.setDate(date.getDate() + 2); 경고( 날짜 ); // 2016년 3월 1일
해당 기능은 특정 기간 이후의 날짜를 가져오는 데 자주 사용됩니다. 예를 들어, "지금으로부터 70초 후"에 대한 날짜를 구해 보겠습니다.
날짜 = 새 날짜()를 설정합니다. date.setSeconds(date.getSeconds() + 70); 경고( 날짜 ); //올바른 날짜를 보여줍니다
0 또는 음수 값을 설정할 수도 있습니다. 예를 들어:
날짜 = 새 날짜(2016, 0, 2); // 2016년 1월 2일 날짜.setDate(1); // 매월 1일을 설정 경고( 날짜 ); 날짜.setDate(0); // min day는 1이므로 전월의 마지막 날을 가정한다. 경고( 날짜 ); // 2015년 12월 31일
Date
객체가 숫자로 변환되면 date.getTime()
과 동일한 타임스탬프가 됩니다.
날짜 = 새 날짜()를 설정합니다. 경고(+날짜); // 밀리초 단위, date.getTime()과 동일
중요한 부작용: 날짜를 뺄 수 있으며 그 결과는 ms 단위의 차이입니다.
이는 시간 측정에 사용될 수 있습니다.
시작하자 = 새로운 Date(); // 시간 측정 시작 // 작업을 수행 for (let i = 0; i < 100000; i++) { let doSomething = i * i * i; } end = new Date(); // 측정 시간 종료 경고( `루프에 ${end - start} ms가 걸렸습니다` );
시간만 측정하려는 경우에는 Date
개체가 필요하지 않습니다.
현재 타임스탬프를 반환하는 특별한 메서드 Date.now()
가 있습니다.
의미상 new Date().getTime()
과 동일하지만 중간 Date
객체를 생성하지 않습니다. 따라서 더 빠르고 가비지 수집에 부담을 주지 않습니다.
주로 편의를 위해 사용되거나 JavaScript 게임이나 기타 특수 애플리케이션과 같이 성능이 중요한 경우에 사용됩니다.
그래서 아마도 이것이 더 나을 것입니다:
시작하자 = Date.now(); // 1970년 1월 1일부터 밀리초 계산 // 작업을 수행 for (let i = 0; i < 100000; i++) { let doSomething = i * i * i; } 종료하자 = Date.now(); // 완료 경고( `루프에 ${end - start} ms가 걸렸습니다` ); // 날짜가 아닌 숫자를 뺍니다.
CPU를 많이 사용하는 기능에 대한 신뢰할 수 있는 벤치마크를 원한다면 주의해야 합니다.
예를 들어, 두 날짜 간의 차이를 계산하는 두 가지 함수를 측정해 보겠습니다. 어느 것이 더 빠를까요?
이러한 성능 측정을 종종 "벤치마크"라고 합니다.
// date1과 date2가 있는데, 어느 함수가 차이를 ms 단위로 더 빨리 반환합니까? 함수 diffSubtract(날짜1, 날짜2) { 날짜2 - 날짜1 반환; } // 또는 함수 diffGetTime(날짜1, 날짜2) { return date2.getTime() - date1.getTime(); }
이 둘은 정확히 동일한 작업을 수행하지만 그 중 하나는 명시적인 date.getTime()
사용하여 날짜를 ms 단위로 가져오고 다른 하나는 날짜를 숫자로 변환하는 데 의존합니다. 그들의 결과는 항상 동일합니다.
그렇다면 어느 것이 더 빠른가요?
첫 번째 아이디어는 연속해서 여러 번 실행하고 시차를 측정하는 것일 수 있습니다. 우리의 경우 함수는 매우 간단하므로 최소한 100,000번은 수행해야 합니다.
측정해보자:
함수 diffSubtract(날짜1, 날짜2) { 날짜2 - 날짜1 반환; } 함수 diffGetTime(날짜1, 날짜2) { return date2.getTime() - date1.getTime(); } 기능 벤치(f) { date1 = new Date(0)로 둡니다. date2 = new Date()를 보자; 시작하자 = Date.now(); for (let i = 0; i < 100000; i++) f(date1, date2); return Date.now() - 시작; } Alert( 'diffSubtract 시간: ' + bench(diffSubtract) + 'ms' ); Alert( 'diffGetTime 시간: ' + bench(diffGetTime) + 'ms' );
우와! getTime()
사용하는 것이 훨씬 빠릅니다! 유형 변환이 없기 때문에 엔진을 최적화하는 것이 훨씬 쉽습니다.
좋아요, 뭔가 있어요. 하지만 아직은 좋은 벤치마크가 아닙니다.
bench(diffSubtract)
실행 시 CPU가 병렬로 작업을 수행하고 리소스를 소비하고 있다고 상상해 보세요. 그리고 bench(diffGetTime)
실행할 때쯤 해당 작업이 완료됩니다.
최신 다중 프로세스 OS에 대한 매우 실제적인 시나리오입니다.
결과적으로 첫 번째 벤치마크는 두 번째 벤치마크보다 CPU 리소스가 적습니다. 그러면 잘못된 결과가 나올 수 있습니다.
보다 안정적인 벤치마킹을 위해서는 전체 벤치마크 팩을 여러 번 다시 실행해야 합니다.
예를 들어 다음과 같습니다.
함수 diffSubtract(날짜1, 날짜2) { 날짜2 - 날짜1 반환; } 함수 diffGetTime(날짜1, 날짜2) { return date2.getTime() - date1.getTime(); } 기능 벤치(f) { date1 = new Date(0)로 둡니다. date2 = new Date()를 보자; 시작하자 = Date.now(); for (let i = 0; i < 100000; i++) f(date1, date2); return Date.now() - 시작; } time1 = 0으로 놔두세요; time2 = 0으로 두십시오. // bench(diffSubtract)와 bench(diffGetTime)를 각각 10번씩 교대로 실행합니다. for (let i = 0; i < 10; i++) { time1 += bench(diffSubtract); time2 += bench(diffGetTime); } Alert( 'diffSubtract에 대한 총 시간: ' + time1 ); Alert( 'diffGetTime의 총 시간: ' + time2 );
최신 JavaScript 엔진은 여러 번 실행되는 "핫 코드"에만 고급 최적화를 적용하기 시작합니다(드물게 실행되는 코드는 최적화할 필요가 없음). 따라서 위의 예에서는 첫 번째 실행이 제대로 최적화되지 않았습니다. 가열 실행을 추가할 수 있습니다.
// 메인 루프 이전에 "가열"하기 위해 추가됨 벤치(diffSubtract); 벤치(diffGetTime); // 이제 벤치마크 for (let i = 0; i < 10; i++) { time1 += bench(diffSubtract); time2 += bench(diffGetTime); }
마이크로벤치마킹을 조심하세요
최신 JavaScript 엔진은 많은 최적화를 수행합니다. 특히 운영자의 작동 방식이나 내장 기능과 같은 아주 작은 것을 벤치마킹할 때 "정상적인 사용"과 비교하여 "인공 테스트"의 결과를 조정할 수 있습니다. 따라서 성능을 진지하게 이해하고 싶다면 JavaScript 엔진이 어떻게 작동하는지 연구하십시오. 그러면 아마도 마이크로벤치마크가 전혀 필요하지 않을 것입니다.
V8에 관한 훌륭한 기사 팩은 https://mrale.ph에서 찾을 수 있습니다.
Date.parse(str) 메소드는 문자열에서 날짜를 읽을 수 있습니다.
문자열 형식은 YYYY-MM-DDTHH:mm:ss.sssZ
여야 합니다. 여기서:
YYYY-MM-DD
– 날짜는 연월일입니다.
문자 "T"
구분 기호로 사용됩니다.
HH:mm:ss.sss
– 시간은 시, 분, 초, 밀리초입니다.
선택사항인 'Z'
부분은 +-hh:mm
형식으로 시간대를 나타냅니다. 단일 문자 Z
UTC+0을 의미합니다.
YYYY-MM-DD
, YYYY-MM
또는 심지어 YYYY
와 같이 더 짧은 변형도 가능합니다.
Date.parse(str)
에 대한 호출은 지정된 형식의 문자열을 구문 분석하고 타임스탬프(1970년 1월 1일 UTC+0의 밀리초 수)를 반환합니다. 형식이 유효하지 않으면 NaN
반환합니다.
예를 들어:
ms = Date.parse('2012-01-26T13:51:50.417-07:00'); 경고(ms); // 1327611110417(타임스탬프)
타임스탬프에서 new Date
객체를 즉시 생성할 수 있습니다.
let date = new Date( Date.parse('2012-01-26T13:51:50.417-07:00') ); 경고(날짜);
JavaScript의 날짜와 시간은 Date 객체로 표시됩니다. "날짜만" 또는 "시간만"을 생성할 수 없습니다. Date
개체는 항상 두 가지를 모두 갖습니다.
월은 0부터 계산됩니다(예, 1월은 0월입니다).
getDay()
의 요일도 0(일요일)부터 계산됩니다.
범위를 벗어난 구성 요소가 설정되면 Date
자동으로 수정됩니다. 일/월/시간을 더하거나 빼는 데 적합합니다.
날짜를 빼서 밀리초 단위로 차이를 얻을 수 있습니다. Date
숫자로 변환되면 타임스탬프가 되기 때문입니다.
현재 타임스탬프를 빠르게 얻으려면 Date.now()
사용하세요.
다른 많은 시스템과 달리 JavaScript의 타임스탬프는 초 단위가 아닌 밀리초 단위입니다.
때로는 더 정확한 시간 측정이 필요합니다. JavaScript 자체에는 시간을 마이크로초(100만분의 1초) 단위로 측정하는 방법이 없지만 대부분의 환경에서 이를 제공합니다. 예를 들어, 브라우저에는 페이지 로딩 시작부터 마이크로초 정밀도(점 뒤 3자리)로 밀리초 수를 제공하는 Performance.now()가 있습니다.
Alert(`${performance.now()}ms 전에 로드가 시작되었습니다`); // 다음과 같습니다: "34731.26000000001ms 전에 로드가 시작되었습니다." // .26은 마이크로초(260마이크로초)입니다. // 소수점 이하 3자리 이상은 정밀도 오류이며 처음 3자리만 맞습니다.
Node.js에는 microtime
모듈과 다른 방법이 있습니다. 기술적으로 거의 모든 장치와 환경에서 더 높은 정밀도를 얻을 수 있지만 Date
에는 없습니다.
중요도: 5
2012년 2월 20일 오전 3시 12분이라는 날짜에 대한 Date
객체를 만듭니다. 시간대는 현지입니다.
alert
사용하여 표시하십시오.
new Date
생성자는 현지 시간대를 사용합니다. 따라서 기억해야 할 유일한 중요한 점은 달이 0부터 시작한다는 것입니다.
따라서 2월에는 1위가 있습니다.
다음은 날짜 구성 요소로 숫자를 사용하는 예입니다.
//새 날짜(년, 월, 일, 시, 분, 초, 밀리초) d1 = new Date(2012, 1, 20, 3, 12)로 설정합니다. 경고(d1);
다음과 같이 문자열에서 날짜를 생성할 수도 있습니다.
//새 날짜(데이터 문자열) d2 = new Date("2012-02-20T03:12"); 경고(d2);
중요도: 5
요일을 짧은 형식('MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU')으로 표시하는 함수 getWeekDay(date)
를 작성하세요.
예를 들어:
날짜 = 새 날짜(2012, 0, 3); // 2012년 1월 3일 경고( getWeekDay(날짜) ); // "TU"를 출력해야 합니다.
테스트를 통해 샌드박스를 엽니다.
date.getDay()
메소드는 일요일부터 시작하여 평일의 숫자를 반환합니다.
요일의 배열을 만들어 숫자로 적절한 요일 이름을 얻을 수 있도록 합시다:
함수 getWeekDay(날짜) { let days = ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA']; 반환일[date.getDay()]; } 날짜 = 새 날짜(2014, 0, 3); // 2014년 1월 3일 경고( getWeekDay(날짜) ); // 정말로
샌드박스에서 테스트를 통해 솔루션을 엽니다.
중요도: 5
유럽 국가에는 월요일(1번)부터 시작하여 화요일(2번), 일요일(7번)까지의 요일이 있습니다. date
에 대해 "유럽" 요일을 반환하는 함수 getLocalDay(date)
를 작성하세요.
날짜 = 새 날짜(2012, 0, 3); // 2012년 1월 3일 경고( getLocalDay(date) ); // 화요일, 2가 표시되어야 합니다.
테스트를 통해 샌드박스를 엽니다.
함수 getLocalDay(날짜) { 하루 = date.getDay(); if (day == 0) { // 주중 0(일요일)은 유럽에서는 7입니다. 일 = 7; } 귀국일; }
샌드박스에서 테스트를 통해 솔루션을 엽니다.
중요도: 4
date
에서 days
전의 일자를 반환하는 getDateAgo(date, days)
함수를 만듭니다.
예를 들어 오늘이 20일이면 getDateAgo(new Date(), 1)
19일이어야 하고 getDateAgo(new Date(), 2)
는 18일이어야 합니다.
days=365
이상 안정적으로 작동해야 합니다.
날짜 = 새 날짜(2015, 0, 2); 경고( getDateAgo(날짜, 1) ); // 1, (2015년 1월 1일) 경고( getDateAgo(date, 2) ); // 31, (2014년 12월 31일) 경고( getDateAgo(date, 365) ); // 2, (2014년 1월 2일)
PS 함수는 주어진 date
수정해서는 안 됩니다.
테스트를 통해 샌드박스를 엽니다.
아이디어는 간단합니다. date
에서 주어진 일수를 빼는 것입니다.
함수 getDateAgo(날짜, 요일) { date.setDate(date.getDate() - 일); 반환 날짜.getDate(); }
…그러나 이 함수는 date
변경해서는 안 됩니다. 날짜를 제공하는 외부 코드에서는 날짜가 변경될 것으로 예상하지 않기 때문에 이는 중요한 것입니다.
이를 구현하려면 다음과 같이 날짜를 복제해 보겠습니다.
함수 getDateAgo(날짜, 요일) { let dateCopy = new Date(날짜); dateCopy.setDate(date.getDate() - 일); dateCopy.getDate()를 반환합니다. } 날짜 = 새 날짜(2015, 0, 2); 경고( getDateAgo(날짜, 1) ); // 1, (2015년 1월 1일) 경고( getDateAgo(date, 2) ); // 31, (2014년 12월 31일) 경고( getDateAgo(date, 365) ); // 2, (2014년 1월 2일)
샌드박스에서 테스트를 통해 솔루션을 엽니다.
중요도: 5
월의 마지막 날을 반환하는 getLastDayOfMonth(year, month)
함수를 작성하세요. 때로는 2월이 30일, 31일, 심지어 28/29일이 될 때도 있습니다.
매개변수:
year
– 4자리 연도(예: 2012)
month
– 월, 0부터 11까지.
예를 들어, getLastDayOfMonth(2012, 1) = 29
(윤년, 2월)입니다.
테스트를 통해 샌드박스를 엽니다.
다음 달을 사용하여 날짜를 생성하고 날짜로 0을 전달해 보겠습니다.
함수 getLastDayOfMonth(년, 월) { 날짜 = 새 날짜(년, 월 + 1, 0); 반환 날짜.getDate(); } 경고( getLastDayOfMonth(2012, 0) ); // 31 경고( getLastDayOfMonth(2012, 1) ); // 29 경고( getLastDayOfMonth(2013, 1) ); // 28
일반적으로 날짜는 1부터 시작하지만 기술적으로는 임의의 숫자를 전달할 수 있으며 날짜는 자동으로 조정됩니다. 따라서 0을 전달하면 "매월 1일 전의 하루", 즉 "지난 달의 마지막 날"을 의미합니다.
샌드박스에서 테스트를 통해 솔루션을 엽니다.
중요도: 5
오늘이 시작되는 시점부터 초 수를 반환하는 함수 getSecondsToday()
를 작성하세요.
예를 들어, 지금이 10:00 am
이고 일광 절약 시간제 근무 시간이 없다면 다음과 같습니다.
getSecondsToday() == 36000 // (3600 * 10)
이 기능은 언제든지 작동해야 합니다. 즉, "오늘"이라는 값이 하드코딩되어서는 안 됩니다.
초 수를 얻으려면 현재 날짜와 시간 00:00:00을 사용하여 날짜를 생성한 다음 "지금"에서 빼면 됩니다.
차이점은 하루 시작부터의 밀리초 수이며, 초를 얻으려면 1000으로 나누어야 합니다.
함수 getSecondsToday() { 이제 = new Date(); // 현재 일/월/년을 사용하여 객체를 생성합니다. 오늘 = new Date(now.getFullYear(), now.getMonth(), now.getDate()); diff = 지금 - 오늘; // ms 차이 return Math.round(diff / 1000); // 초를 만든다 } 경고( getSecondsToday() );
다른 해결책은 시간/분/초를 가져와 초로 변환하는 것입니다.
함수 getSecondsToday() { d = new Date()로 둡니다. return d.getHours() * 3600 + d.getMinutes() * 60 + d.getSeconds(); } 경고( getSecondsToday() );
중요도: 5
내일까지의 시간(초)을 반환하는 getSecondsToTomorrow()
함수를 만듭니다.
예를 들어 지금이 23:00
이면 다음과 같습니다.
getSecondsToTomorrow() == 3600
PS 이 기능은 언제든지 작동해야 하며 "오늘"은 하드코딩되지 않습니다.
내일까지의 밀리초 수를 얻으려면 "내일 00:00:00"에서 현재 날짜를 뺄 수 있습니다.
먼저 "내일"을 생성한 다음 실행합니다.
함수 getSecondsToTomorrow() { 이제 = new Date(); // 내일 날짜 내일 = new Date(now.getFullYear(), now.getMonth(), now.getDate()+1); diff = 내일 - 지금; // ms 차이 return Math.round(diff / 1000); // 초로 변환 }
대체 솔루션:
함수 getSecondsToTomorrow() { 이제 = new Date(); 시간 = now.getHours()를 보자; 분 = now.getMinutes()를 보자; 초 = now.getSeconds(); totalSecondsToday = (시간 * 60 + 분) * 60 + 초; totalSecondsInADay = 86400으로 설정합니다. totalSecondsInADay - totalSecondsToday를 반환합니다. }
많은 국가에는 일광 절약 시간(DST)이 있으므로 23시간 또는 25시간인 날이 있을 수 있습니다. 그러한 날은 별도로 처리하고 싶을 수도 있습니다.
중요도: 4
다음과 같이 date
형식을 지정하는 함수 formatDate(date)
작성하세요.
이후 date
1초 미만으로 경과한 경우 "right now"
입니다.
그렇지 않고 이후 date
1분 미만으로 경과한 경우 "n sec. ago"
가 됩니다.
그렇지 않고, 1시간 미만이면 "m min. ago"
입니다.
그렇지 않으면 "DD.MM.YY HH:mm"
형식의 전체 날짜입니다. 즉, "day.month.year hours:minutes"
이며 모두 2자리 형식입니다(예: 31.12.16 10:00
.
예를 들어:
Alert( formatDate(new Date(new Date - 1)) ); // "지금 바로" Alert( formatDate(new Date(new Date - 30 * 1000)) ); // "30초 전" Alert( formatDate(new Date(new Date - 5 * 60 * 1000)) ); // "5분 전" // 어제 날짜(예: 31.12.16 20:00) Alert( formatDate(new Date(new Date - 86400 * 1000)) );
테스트를 통해 샌드박스를 엽니다.
date
부터 지금까지의 시간을 얻으려면 날짜를 빼자.
함수 형식날짜(날짜) { diff = new Date() - 날짜를 지정합니다. // 밀리초 단위의 차이 if (diff < 1000) { // 1초 미만 '지금 당장'을 반환합니다. } 초 = Math.floor(diff / 1000); // diff를 초로 변환 if (초 < 60) { sec + '초를 반환합니다. 전에'; } min = Math.floor(diff / 60000); // 차이를 분으로 변환 if (최소 < 60) { min + ' min을 반환합니다. 전에'; } // 날짜 형식 지정 // 한자리 수의 일/월/시/분 앞에 0을 추가합니다. d = 날짜라고 하자; d = [ '0' + d.getDate(), '0' + (d.getMonth() + 1), '' + d.getFullYear(), '0' + d.getHours(), '0' + d.getMinutes() ].map(컴포넌트 => 컴포넌트.슬라이스(-2)); // 모든 구성 요소의 마지막 2자리를 가져옵니다. // 구성 요소를 날짜에 결합합니다. return d.slice(0, 3).join('.') + ' ' + d.slice(3).join(':'); } Alert( formatDate(new Date(new Date - 1)) ); // "지금 바로" Alert( formatDate(new Date(new Date - 30 * 1000)) ); // "30초 전" Alert( formatDate(new Date(new Date - 5 * 60 * 1000)) ); // "5분 전" // 어제 날짜(예: 31.12.2016 20:00) Alert( formatDate(new Date(new Date - 86400 * 1000)) );
대체 솔루션:
함수 형식날짜(날짜) { dayOfMonth = date.getDate(); 월 = date.getMonth() + 1; 연도 = date.getFullYear(); 시간 = date.getHours(); 분 = date.getMinutes()를 보자; diffMs = new Date() - 날짜를 지정합니다. diffSec = Math.round(diffMs / 1000); diffMin = diffSec / 60으로 설정합니다. diffHour = diffMin / 60으로 설정합니다. // 서식 지정 연도 = year.toString().slice(-2); 월 = 월 < 10 ? '0' + 월 : 월; dayOfMonth = dayOfMonth < 10 ? '0' + dayOfMonth : dayOfMonth; 시간 = 시간 < 10 ? '0' + 시 : 시; 분 = 분 < 10 ? '0' + 분 : 분; if (diffSec < 1) { '지금 당장'을 반환합니다. } else if (diffMin < 1) { `${diffSec}초를 반환합니다. 전` } else if (diffHour < 1) { `${diffMin}분을 반환합니다. 전` } 또 다른 { `${dayOfMonth}.${month}.${year} ${hour}:${분}`을 반환합니다. } }
샌드박스에서 테스트를 통해 솔루션을 엽니다.