웹 애플리케이션을 작성하는 동안 DB에 모든 날짜 시간을 UTC 타임 스탬프 로 저장 (서버 측)하는 것이 좋습니다.
JavaScript의 시간대 조작 측면에서 많은 것을 할 수 없다는 것을 알았을 때 놀랐습니다.
Date 객체를 약간 확장했습니다. 이 기능이 의미가 있습니까? 기본적으로 서버에 무엇이든 보낼 때 마다이 기능으로 포맷 된 타임 스탬프가됩니다 …
여기에 큰 문제가 있습니까? 아니면 다른 각도의 솔루션입니까?
Date.prototype.getUTCTime = function(){
return new Date(
this.getUTCFullYear(),
this.getUTCMonth(),
this.getUTCDate(),
this.getUTCHours(),
this.getUTCMinutes(),
this.getUTCSeconds()
).getTime();
}
그것은 나에게 조금 복잡해 보입니다. 그리고 성능에 대해서도 확신이 없습니다.
답변
-
이러한 방식으로 생성 된 날짜는 현지 시간대를 사용하여 생성 된 날짜를 잘못 만듭니다. 특정 날짜 객체의 시간대를 설정하려면 시간대를 포함하는 날짜 문자열에서 시간대를 생성해야합니다. (이전 Android 브라우저에서 작동하게하는 데 문제가있었습니다.)
-
getTime()
평 초가 아닌 밀리 초 를 반환합니다.
UTC / Unix 타임 스탬프의 경우 다음과 같이 충분합니다.
Math.floor((new Date()).getTime() / 1000)
현재 시간대 오프셋을 결과에 반영합니다. 문자열 표현의 경우 David Ellis의 답변이 효과가 있습니다.
명확히하기 위해 :
new Date(Y, M, D, h, m, s)
해당 입력은 현지 시간으로 처리됩니다 . 경우 UTC 시간이 전달되고, 결과는 다를 수 있습니다. 관찰하십시오 (현재 GMT +02 : 00에 있으며 07:50입니다).
> var d1 = new Date();
> d1.toUTCString();
"Sun, 18 Mar 2012 05:50:34 GMT" // two hours less than my local time
> Math.floor(d1.getTime()/ 1000)
1332049834
> var d2 = new Date( d1.getUTCFullYear(), d1.getUTCMonth(), d1.getUTCDate(), d1.getUTCHours(), d1.getUTCMinutes(), d1.getUTCSeconds() );
> d2.toUTCString();
"Sun, 18 Mar 2012 03:50:34 GMT" // four hours less than my local time, and two hours less than the original time - because my GMT+2 input was interpreted as GMT+0!
> Math.floor(d2.getTime()/ 1000)
1332042634
또한 getUTCDate()
로 대체 할 수 없습니다 getUTCDay()
. 그 달의 날짜를getUTCDate()
반환 하기 때문입니다 . 반면 요일을 반환 합니다 .getUTCDay()
답변
getTimezoneOffset 및 getTime을 사용하여 수행 할 수도 있습니다.
x = new Date()
var UTCseconds = (x.getTime() + x.getTimezoneOffset()*60*1000)/1000;
console.log("UTCseconds", UTCseconds)
답변
일반적인 형식으로 UTC 시간을 얻는 가장 쉬운 방법은 다음과 같습니다.
new Date().toISOString()
"2016-06-03T23:15:33.008Z"
답변
실제로 js의 Date 값이 C # DateTime 객체를 말하는 것보다 훨씬 낫다고 생각합니다. C # DateTime 개체에는 Kind 속성이 있지만 엄격한 기본 시간대는 없으며 UTC 이외의 시간과 현지 시간이 아닌 두 시간 사이를 변환하는 경우 시간대 변환을 추적하기가 어렵습니다. js에서 모든 Date 값은 기본 UTC 값을 가지며, 이는 UTC 또는 표준 시간대 변환에 관계없이 전달되고 알려져 있습니다. Date 객체에 대한 가장 큰 불만은 브라우저 구현자가 포함하기로 선택한 정의되지 않은 동작의 양으로, js에서 날짜를 공격하는 사람들을 사양을 읽는 것보다 시행 착오와 혼동시킬 수 있습니다. iso8601.js와 같은 것을 사용하면 Date 객체의 단일 구현을 정의하여 이러한 다양한 동작을 해결할 수 있습니다.
기본적으로 스펙은 ISO 8601 날짜 형식으로 확장하여 날짜를 만들 수 있다고 말합니다.
var someDate = new Date('2010-12-12T12:00Z');
따라서이 방법으로 정확한 UTC 시간을 유추 할 수 있습니다.
Date 값을 서버로 다시 전달하려면 전화하십시오.
someDate.toISOString();
또는 밀리 초 타임 스탬프 (1970 년 1 월 1 일 UTC UTC 밀리 초)로 작업하려는 경우
someDate.getTime();
ISO 8601이 표준입니다. 날짜 오프셋을 포함하면 날짜 문자열의 의미에 대해 혼동 할 수 없습니다. 개발자로서 이것이 의미하는 바는 현지 시간 변환을 직접 처리 할 필요가 없다는 것 입니다. 현지 시간 값은 사용자의 편의를 위해 존재하며 기본적으로 날짜 값은 현지 시간으로 표시됩니다. 모든 현지 시간 조작을 통해 사용자에게 합리적인 것을 표시하고 사용자 입력에서 문자열을 변환 할 수 있습니다. 가능한 빨리 UTC로 변환하는 것이 좋으며 js Date 객체는 이것을 사소한 것으로 만듭니다.
단점은 웹 사이트 특정 설정에 대해 성가 시게 할 수있는 클라이언트 또는 시간대 (로컬)를 강제로 적용 할 수있는 범위가 많지 않지만 그 이유는 사용자라는 것입니다. 손대지 말아야 할 구성.
즉, 표준 시간대 조작에 대한 기본 지원이 많지 않은 이유는 단순히 수행하고 싶지 않기 때문입니다.
답변
일반적으로 클라이언트 측에서 “시간대 조작”을 많이 수행 할 필요는 없습니다. 원칙적으로 난의 형태로 UTC 날짜와 저장 및 작업에 시도 ticks
“또는 1970 년 1 월 1 일 자정 이후의 밀리 초 수를 .” 이를 통해 스토리지, 정렬, 오프셋 계산을 단순화하고 무엇보다도 “일광 절약 시간”조정의 어려움을 없애줍니다. 여기 내가 사용하는 작은 JavaScript 코드가 있습니다.
현재 UTC 시간을 얻으려면
function getCurrentTimeUTC()
{
//RETURN:
// = number of milliseconds between current UTC time and midnight of January 1, 1970
var tmLoc = new Date();
//The offset is in minutes -- convert it to ms
return tmLoc.getTime() + tmLoc.getTimezoneOffset() * 60000;
}
그런 다음 일반적으로 필요한 것은 최종 사용자의 날짜 / 시간을 현지 시간대 및 형식으로 지정하는 것입니다. 다음은 클라이언트 컴퓨터의 모든 날짜 및 시간 형식 복잡성을 처리합니다.
function formatDateTimeFromTicks(nTicks)
{
//'nTicks' = number of milliseconds since midnight of January 1, 1970
//RETURN:
// = Formatted date/time
return new Date(nTicks).toLocaleString();
}
function formatDateFromTicks(nTicks)
{
//'nTicks' = number of milliseconds since midnight of January 1, 1970
//RETURN:
// = Formatted date
return new Date(nTicks).toLocaleDateString();
}
function formatTimeFromTicks(nTicks)
{
//'nTicks' = number of milliseconds since midnight of January 1, 1970
//RETURN:
// = Formatted time
return new Date(nTicks).toLocaleTimeString();
}
따라서 다음 예제는
var ticks = getCurrentTimeUTC(); //Or get it from the server
var __s = "ticks=" + ticks +
", DateTime=" + formatDateTimeFromTicks(ticks) +
", Date=" + formatDateFromTicks(ticks) +
", Time=" + formatTimeFromTicks(ticks);
document.write("<span>" + __s + "</span>");
다음을 반환합니다 (미국 영어 로캘).
틱 = 1409103400661, DateTime = 8 / 26 / 2014 6:36:40 PM, Date = 8 / 26 / 2014, 시간 = 6 : 36 : 40 PM
답변
나는 이것이 더 나은 해결책이라고 생각한다
// UTC milliseconds
new Date(Date.now()+(new Date().getTimezoneOffset()*60000)).getTime()
// UTC seconds
new Date(Date.now()+(new Date().getTimezoneOffset()*60000)).getTime()/1000|0
답변
당신이 원하는 경우 하나 라이너 는 UTC 유닉스 타임 스탬프는 자바 스크립트로 생성 할 수 있습니다 :
var currentUnixTimestap = ~~(+new Date() / 1000);
이것은 시스템의 시간대를 고려합니다. 기본적으로 에포크 (epoch) 이후의 시간 (초)입니다.
작동 방식 :
- 날짜 객체 생성 :
new Date()
. unary +
객체 생성 전에 를 추가하여 타임 스탬프 로 변환하여로 변환하십시오timestamp integer
. :+new Date()
.- 밀리 초를 초로 변환하십시오.
+new Date() / 1000
- 이중 물결표 를 사용 하여 값을 정수로 반올림하십시오. :
~~(+new Date())