사용자의 로캘 형식 및 시간 오프셋으로 날짜 / 시간 표시


167

서버가 항상 HTML로 UTC로 날짜를 제공하고 클라이언트 사이트의 JavaScript가 사용자의 현지 시간대로 변환하도록하고 싶습니다.

사용자의 로캘 날짜 형식으로 출력 할 수있는 경우 보너스.

답변:


165

UTC 날짜로 시작하는 가장 확실한 방법은 새 Date객체 를 만들고 setUTC…메소드를 사용하여 원하는 날짜 / 시간으로 설정하는 것입니다.

그런 다음 다양한 toLocale…String방법이 현지화 된 출력을 제공합니다.

예:

// This would come from the server.
// Also, this whole block could probably be made into an mktime function.
// All very bare here for quick grasping.
d = new Date();
d.setUTCFullYear(2004);
d.setUTCMonth(1);
d.setUTCDate(29);
d.setUTCHours(2);
d.setUTCMinutes(45);
d.setUTCSeconds(26);

console.log(d);                        // -> Sat Feb 28 2004 23:45:26 GMT-0300 (BRT)
console.log(d.toLocaleString());       // -> Sat Feb 28 23:45:26 2004
console.log(d.toLocaleDateString());   // -> 02/28/2004
console.log(d.toLocaleTimeString());   // -> 23:45:26

일부 참고 문헌 :


1
파이어 폭스에서 toLocateDateString()뭔가를 반환 '2014년 1월 12일 (일요일)'와 같은 외모 ...
BlueRaja - 대니 Pflughoeft

1
흠, 그것은 꽤 심각한 문제입니다. 브라우저에서 날짜가 동일하게 표시되도록하려면 이러한 방법을 사용할 수 없습니다. 알려진 대안이 있습니까?
Josh Mc

6
위의 초기화 한 줄 버전 :var d = new Date(Date.UTC(2004,1,29,2,45,26));
m1kael

4
Chrome (v35 기준)은 toLocaleString()기능 에서 사용자의 로캘을 고려하지 않는 것이 좋습니다 .
벤노

8
죄송하지만 위의 코드를 실행하면 날짜가 미국 형식으로 표시됩니다 (호주에 있음) 에서이 방법이 작동하지 않습니다. 또한 MDN 은 '사용 된 로케일과 반환 된 문자열의 형태는 전적으로 구현에 따라 다릅니다'라고 말합니다.
tgrrr

65

새 프로젝트의 경우 moment.js를 사용 하십시오.

이 질문은 꽤 오래되었으므로 당시에moment.js 가 존재하지 않았지만 새로운 프로젝트의 경우 이와 같은 작업을 단순화합니다.

UTC에서 날짜 문자열을 다음과 같이 구문 분석하는 것이 가장 좋습니다 ( 모든 브라우저에서 일관된 결과를 얻으려면 서버에서 ISO-8601 호환 문자열을 작성하십시오).

var m = moment("2013-02-08T09:30:26Z");

이제 m응용 프로그램에서 사용 하십시오. moment.js는 기본적으로 표시 작업을위한 현지 시간대입니다. 날짜 및 시간 값을 형식화 하거나 그 일부를 추출 하는 방법 에는 여러 가지 가 있습니다.

다음과 같이 사용자 로케일에서 moment 객체를 포맷 할 수도 있습니다.

m.format('LLL') // Returns "February 8 2013 8:30 AM" on en-us

moment.js 객체를 다른 시간대로 변환하려면 (즉, 로컬 시간대도 UTC도 아닌) moment.js 시간대 확장 이 필요합니다 . 이 페이지에는 몇 가지 예가 있으며 사용하기가 매우 간단합니다.


이 모든 것을 어떻게 결합합니까? m.utcOffset (offset) .format ( 'LLL')이 작동하지 않는 것 같습니다.
bart

해야 Luxon 또는 Day.js는 지금 제안 된 라이브러리를 수?
호머

1
추가For old projects, just use jQuery
Xenos

크롬에없는 일을합니까 - 여전히 쇼입니다 / 시간 컴퓨터의 로케일 설정에서 24 시간으로 설정된 경우에도 오후
우리 비르

20

new Date().getTimezoneOffset()/60시간대에 사용할 수 있습니다 . toLocaleString()사용자의 로캘을 사용하여 날짜를 표시 하는 방법 도 있습니다 .

전체 목록은 다음과 같습니다. 날짜 작업


toLocaleString 은 사용자가 기대할 수있는 형식으로 날짜를 표시하는 데 매우 신뢰할 수 없습니다. ISO 402가 지원되는 경우에도 여전히 신뢰할 수 없으며 형식이 로캘이 아닌 언어를 기반으로합니다.
RobG

@RobG 대신 솔루션이 toLocaleString무엇입니까?
user924

@ user924— 라이브러리를 사용할 수 있으며 선택할 수있는 것이 많습니다. toLocaleString 의 문제점 은 구현에 따라 다양한 언어 및 지역에 대해 서로 다른 수준의 지원으로 다른 결과를 제공한다는 것입니다. 예를 들어 시스템 기본 언어는 en-US가 아니지만 일부 브라우저의 toLocaleString 의 기본 형식 은 미국 형식이며 다른 언어는 내 시스템 언어를 존중합니다. 시간대 이름과 동일하지만 전혀 표준화되지 않았기 때문에 더 나쁩니다. :-(
RobG

7

날짜 개체가 생성되면 다음은 전환을위한 스 니펫입니다.

이 함수는 UTC 형식의 Date 객체와 형식 문자열을 사용합니다. 프로토 타입
이 필요합니다 Date.strftime.

function UTCToLocalTimeString(d, format) {
    if (timeOffsetInHours == null) {
        timeOffsetInHours = (new Date().getTimezoneOffset()/60) * (-1);
    }
    d.setHours(d.getHours() + timeOffsetInHours);

    return d.strftime(format);
}

6
어디서부터 strftime을 했습니까?
Anuj Pandey

시간을 설정하면 Date 객체의 요일 / 날짜 / 년 부분에 영향을 미칩니 까? 보이지 않는 것 같습니다.
ChristoKiwi

1
@ChristoKiwi- setHours에 전달 된 값 은 정수일 것으로 예상됩니다 getTimezoneOffset()/60(예 : 인도 오프셋 +05 : 30은 5.5를 반환 함). 소수는 잘립니다. 그렇지 않으면 시간을 설정하면 다른 값이 업데이트됩니다 (시간을 48로 설정하고 어떤 일이 발생하는지 확인).
RobG

7

JS에서는 위에서 언급 한 것처럼 각 속성을 변환하지 않고 로컬 날짜 시간을 형식화하는 간단하고 크로스 플랫폼 방법이 없습니다.

다음은 로컬 YYYY-MM-DD를 얻는 데 사용하는 빠른 해킹입니다. 최종 날짜에 더 이상 올바른 시간대가 없으므로 시간대를 무시해야하므로 이것은 해킹입니다. 더 필요한 것이 있으면 moment.js를 사용합니다.

var d = new Date();    
d = new Date(d.getTime() - d.getTimezoneOffset() * 60000)
var yyyymmdd = t.toISOString().slice(0,0); 
// 2017-05-09T08:24:26.581Z (but this is not UTC)

d.getTimezoneOffset ()은 표준 시간대 오프셋을 분 단위로 반환하고 d.getTime ()은 ms 단위이므로 x 60,000입니다.


1
@ VG 60k의 출처에 대한 정보를 추가했습니다. 이 도움을 바랍니다.
Jeremy Chone

5

지난 프로젝트에서 사용한 내용은 다음과 같습니다.

var myDate = new Date();
var tzo = (myDate.getTimezoneOffset()/60)*(-1);
//get server date value here, the parseInvariant is from MS Ajax, you would need to do something similar on your own
myDate = new Date.parseInvariant('<%=DataCurrentDate%>', 'yyyyMMdd hh:mm:ss');
myDate.setHours(myDate.getHours() + tzo);
//here you would have to get a handle to your span / div to set.  again, I'm using MS Ajax's $get
var dateSpn = $get('dataDate');
dateSpn.innerHTML = myDate.localeFormat('F');

4
이것은 ASP.NET 관련 항목과 관련이 있습니다.
ZiggyTheHamster

시간대 오프셋은 반드시 한 시간의 배수 일 필요는 없으므로 getTimezoneOffset()/60종종 10 진수 값을 반환합니다. 이것은 많은 장소가 분과 초 단위의 오프셋을 갖는 1900 년 이전 날짜에 특히 해당됩니다. 또한 이제 내역 오프셋을 지원하기 위해 javascript 날짜가 필요합니다. 예를 들어 1890 년 모스크바의 오프셋은 +2 : 30 : 17입니다. 브라우저, 시간대, Chrome 67 오류를 참조하십시오 .
RobG

3

.getTimezoneOffset()방법은 표준 시간대 오프셋을 분 단위로보고하고 GMT / UTC 표준 시간대에서 "서쪽"을 계산하여 일반적으로 익숙한 것과는 다른 오프셋 값을 만듭니다. (예를 들어, 뉴욕 시간은 +240 분 또는 +4 시간으로보고됩니다)

시간 단위로 표준 시간대 오프셋을 얻으려면 다음을 사용해야합니다.

var timeOffsetInHours = -(new Date()).getTimezoneOffset()/60

중요 세부 사항 :
일광 절약 시간이 결과에 반영되어 주 - 그래서이 방법을 제공하는 것은 정말입니다 시간 오프셋 -하지 실제 지리적 시간대는 오프셋.


3

PHP 코드의 날짜와 함께 다음과 같이 사용했습니다.

function getLocalDate(php_date) {
  var dt = new Date(php_date);
  var minutes = dt.getTimezoneOffset();
  dt = new Date(dt.getTime() + minutes*60000);
  return dt;
}

우리는 이것을 이렇게 부를 수 있습니다

var localdateObj = getLocalDate('2015-09-25T02:57:46');

문제는 PHP가 아니라 JavaScript에 관한 것이었다.
pipedreambomb

5
답변은 자바 스크립트로만 이루어지며 질문에 서버 날짜가 UTC임을 언급합니다. 서버는 어떤 언어로도 가능합니다. 그래서 나는 PHP에 대해서만 대답
hriziya

3

지금까지 답변을 혼합하고 추가합니다. 모든 답변을 읽고 한동안 추가 조사하여 사용자의 현지 시간대 형식으로 db의 날짜 시간 문자열을 표시해야했기 때문입니다.

날짜 시간 문자열은 python / django db에서 다음 형식으로 제공됩니다 .2016-12-05T15 : 12 : 24.215Z

JavaScript에서 브라우저 언어를 안정적으로 감지하는 것이 모든 브라우저에서 작동하지 않는 것 같습니다 ( 브라우저 언어 기본 설정을 감지 하려면 JavaScript 참조 ). 서버에서 브라우저 언어를 얻습니다.

Python / Django : 요청 브라우저 언어를 컨텍스트 매개 변수로 보냅니다.

language = request.META.get('HTTP_ACCEPT_LANGUAGE')
return render(request, 'cssexy/index.html', { "language": language })

HTML : 숨겨진 입력으로 작성하십시오.

<input type="hidden" id="browserlanguage" value={{ language }}/>

JavaScript : 숨겨진 입력 값 (예 : en-GB, en-US; q = 0.8, en; q = 0.6 /)을 가져온 다음 바꾸기 및 정규식을 통해서만 목록의 첫 번째 언어를 가져옵니다.

const browserlanguage = document.getElementById("browserlanguage").value;
var defaultlang = browserlanguage.replace(/(\w{2}\-\w{2}),.*/, "$1");

JavaScript : 날짜 / 시간으로 변환하고 형식을 지정하십시오.

var options = { hour: "2-digit", minute: "2-digit" };
var dt = (new Date(str)).toLocaleDateString(defaultlang, options);

참조 : https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

결과는 다음과 같습니다 (브라우저 언어는 en-gb 임) : 05/12/2016, 14:58


3

// new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]])
var serverDate = new Date(2018, 5, 30, 19, 13, 15); // just any date that comes from server
var serverDateStr = serverDate.toLocaleString("en-US", {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric'
})
var userDate = new Date(serverDateStr + " UTC");
var locale = window.navigator.userLanguage || window.navigator.language;

var clientDateStr = userDate.toLocaleString(locale, {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric'
});

var clientDateTimeStr = userDate.toLocaleString(locale, {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric'
});

console.log("Server UTC date: " + serverDateStr);
console.log("User's local date: " + clientDateStr);
console.log("User's local date&time: " + clientDateTimeStr);


참고로 : developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ( options내 사건에 필요한 부분이 필요함 )
Xenos

2

내가 찾은 가장 좋은 해결책은 [time display = "llll"datetime = "UTC TIME"/] 태그를 만들고 javascript (jquery)를 사용하여 사용자 시간을 기준으로 구문 분석하고 표시하는 것입니다.

http://momentjs.com/ Moment.js

시간을 멋지게 표시합니다.


2

GMT의 시간대 오프셋을 분 단위로보고하는 다음을 사용할 수 있습니다.

new Date().getTimezoneOffset();

참고 :-이 함수는 음수를 반환합니다.



1

날짜를 현지 날짜로 변환하려면 toLocaleDateString () 메서드를 사용하십시오.

var date = (new Date(str)).toLocaleDateString(defaultlang, options);

시간을 현지 시간으로 변환하려면 toLocaleTimeString () 메서드를 사용하십시오.

var time = (new Date(str)).toLocaleTimeString(defaultlang, options);

-12

로케일을 수행하는 방법을 모르지만 Javascript는 클라이언트 측 기술입니다.

usersLocalTime = new Date();

클라이언트의 시간과 날짜가 브라우저에 표시되고 내선 컴퓨터에 의해보고 된대로 표시됩니다. 응답에 서버 시간을 포함시키고 간단한 계산을 통해 오프셋을 추측하는 것은 쉽지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.