JavaScript에서 날짜를 다른 시간대로 변환


336

한 시간대의 날짜를 다른 시간대로 변환하는 함수를 찾고 있습니다.

두 개의 매개 변수가 필요합니다.

  • 날짜 ( "2012/04/10 10:10:30 +0000"형식)
  • 시간대 문자열 ( "아시아 / 자카르타")

시간대 문자열은 http://en.wikipedia.org/wiki/Zone.tab에 설명되어 있습니다 .

이 작업을 수행하는 쉬운 방법이 있습니까?


1
주어진 도시의 UTC 오프셋을 찾으십시오. stackoverflow.com/questions/3002910/…
— Brandon Boone

3
UTC 오프셋뿐만 아니라 일광 절약 / 서머 타임도 계산하고 싶습니다. 따라서 시간이 올바르게 돌아옵니다.
— Rizky Ramadhan


이것도 함께 확인하십시오 stackoverflow.com/questions/16084313/…
— Amol M Kulkarni

+ %의 -d '1 년 1 월 1970 날짜 : 유닉스 date 명령을 사용하여 시간대의 설정 끄기
— 안토니

답변:


191

var aestTime = new Date().toLocaleString("en-US", {timeZone: "Australia/Brisbane"});
console.log('AEST time: '+ (new Date(aestTime)).toISOString())

var asiaTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Shanghai"});
console.log('Asia time: '+ (new Date(asiaTime)).toISOString())

var usaTime = new Date().toLocaleString("en-US", {timeZone: "America/New_York"});
console.log('USA time: '+ (new Date(usaTime)).toISOString())

var indiaTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Kolkata"});
console.log('India time: '+ (new Date(indiaTime)).toISOString())

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString


1
이것은 라이브러리를 사용하지 않고 정확하고 표준적인 방법이므로 이에 대한 답변을 변경했습니다.
— Rizky Ramadhan

5
MDN 문서에 따르면 모든 구현에서 인식해야하는 유일한 시간대는 UTC뿐입니다. ( stackoverflow.com/questions/10087819/… ) IE11에서 [Run code snippet] 버튼을 클릭하면 오류가 발생합니다.
— Vivian River

1
지금 모든 브라우저에서 작동하는 구현을 찾고 있다면 누구나 자체 단점으로 아래의 답변을 시도해 볼 수 있습니다.
— Rizky Ramadhan

14
이 답변은 시간대를 올바르게 전달하는 것을 보여줍니다. toLocaleString 것을 보여 주지만 해당 문자열을 Date생성자 로 다시 전달하는 것은 매우 잘못 표시합니다 . 그것은 문제를 요구하고 있습니다. 날짜 문자열 구문 분석기는 로케일 특정 형식을 승인하지 않아도되며 입력은 마치 현지 시간대 인 것처럼 처리됩니다. 하지마 첫 번째 toLocalString호출 의 문자열 출력 만 사용하십시오 .
— Matt Johnson-Pint

4
@MattJohnson 그러면 getHour () 또는 그러한 메소드를 사용할 수 없습니다
— Ali Padida

131

들어 moment.js의 사용자, 당신은 지금 사용할 수있는 순간 시간대를 . 그것을 사용하면 함수는 다음과 같습니다.

function toTimeZone(time, zone) {
    var format = 'YYYY/MM/DD HH:mm:ss ZZ';
    return moment(time, format).tz(zone).format(format);
}

3
새로운 시간대를 추가하는 방법을 잘 모르겠습니다. 문서가 도움이되지 않았습니다. 나는 시간 전문가가 아닌 프로그래머 일뿐입니다!
— Parziphal

8
여기서 문제는 새로운 Date 객체를 반환하지 않고 문자열을 반환한다는 것입니다. 그것이 당신이 원하는 것이라면 물론입니다.
— nickdnk

2
"return moment (time) .tz (zone) .format (format);"이 아닙니까? ? 귀하의 코드에서 제공 한 내용에 "잘못된 날짜"오류가 표시됩니다.
— Tarek

1
브라우저에서 Moment.js를로드 할 수 없습니다. 매우 슬프다 :(
— Daniil Shevelev

4
tz 데이터베이스의 사본으로 브라우저에 180K를 전송하는 것이 마음에 들지 않고 이전 브라우저에서 현재 시간대로 저하 될 수있는 경우을 사용하여 @lambinator의 답변을 시도하십시오 Date.prototype.toLocaleString.
— 피터 V. Mørch

92

http://www.techrepublic.com/article/convert-the-local-time-to-another-time-zone-with-this-javascript/6016329 에서 뻔뻔스럽게 도난

/** 
 * function to calculate local time
 * in a different city
 * given the city's UTC offset
 */
function calcTime(city, offset) {

    // create Date object for current location
    var d = new Date();

    // convert to msec
    // add local time zone offset
    // get UTC time in msec
    var utc = d.getTime() + (d.getTimezoneOffset() * 60000);

    // create new Date object for different city
    // using supplied offset
    var nd = new Date(utc + (3600000*offset));

    // return time as a string
    return "The local time in " + city + " is " + nd.toLocaleString();
}

이 기능은 도시 / 국가 이름 및 오프셋 값을 제공하여 시간대 값을 계산하는 데 유용합니다.


4
근사하지만 .. 그가 지나간 도시를 기반으로 오프셋을 찾아보고 싶다고 생각합니다.
— Brandon Boone

117
일광 절약 시간제 변경 사항은 고려하지 않습니다.
— Robotbugs

12
질문에 대답하지 않고 내 대답에 답하십시오 (+1)
— Reign.85

그 '3600000'은 문자 그대로 나를 죽였습니다! 입력에서 tz는 시간 단위로 제공되어야합니다! 그리고 빼야합니다. 따라서 다음을 전달하면 var d = new Date calcTime ( '', d.getTimezoneOffset () / 60); 같은 시간을 돌려줘야합니다.
— Praveen

1
이 답변은 최신 정보가 아니므로 특히 toLocaleString을 사용하는 부분을 제거해야합니다.이 부분 은 다른 시간대로 이동했을 때 호스트 시간대를보고 할 수 있습니다. 서로 다른 오프셋에 대한 타임 스탬프를 수동으로 만드는 훨씬 더 좋은 방법이 있습니다.
— RobG

89

Safari를 제외한 대부분의 데스크탑 (모바일 아님) 브라우저 는 인수와 함께 toLocaleString 함수를 지원하지만 이전 브라우저는 일반적으로 인수를 무시합니다.

new Date().toLocaleString('en-US', { timeZone: 'Asia/Jakarta' })

4
Firefox와 Edge에서 실패 :(
— Šime Vidas

10
FF 및 IE11 +에서는 이것이 실패하기 때문에 다른 솔루션을 찾아야합니다.
— jdavid.net

2
가장자리와 크롬은 그것을 좋아했다 :)
— Suhail Mumtaz Awan

6
Chrome v59 및 Firefox 데스크톱 v54 및 Android v59의 Chome 및 iOS 10.3의 Safari 10에서 방금 작동했습니다. IE10에서는 작동하지 않았습니다. Date.prototype.toLocaleString ()에 대한 MDN 설명에는toLocaleStringSupportsLocales() 지원을 안정적으로 확인할 수 있는 구현이 있습니다.
— 피터 V. Mørch

1
성공적으로 Node.js를 v8.7.0 테스트
— 하인리히 울 브리 히트

56

알았어!

내가 사용하고 시간대-JS를 . 이것은 코드입니다.

var dt = new timezoneJS.Date("2012/04/10 10:10:30 +0000", 'Europe/London');
dt.setTimezone("Asia/Jakarta");

console.debug(dt); //return formatted date-time in asia/jakarta

90
나는 이것에 반대 투표해야하며 timezone-js는 DST를 지원하지 않으며 readme에서이를 알리지 않으므로 이것을 찾는 사람들에게 나쁜 팁이됩니다. github.com/mde/timezone-js/issues/51 및 제출되었으며 수정되지 않은 다른 많은 문제를 참조하십시오 .

@nus 예,하지만 실제로 클라이언트 측 시간대 / 날짜 관리를위한 솔루션이 없습니다 ... jquery ui datepicker는 이것 때문에 나를 미치게했습니다. 건배
— 루카스

2
@Marabunta는 순간 시간대 (브라이언 드 팔마 의해 답변) 같은 외모 DST 지원 github.com/moment/moment-timezone/issues/21
— welldan97

2
TimezoneJS를 사용하지 마십시오 .DST 변경과 관련하여 버그가 있습니다.
— matf

17

큰 라이브러리를 가져 오지 않으려면 Intl.DateTimeFormat 을 사용 하여 Date 객체를 다른 시간대로 변환하면됩니다.

// Specifying timeZone is what causes the conversion, the rest is just formatting
const options = {
  year: '2-digit', month: '2-digit', day: '2-digit',
  hour: '2-digit', minute: '2-digit', second: '2-digit',
  timeZone: 'Asia/Jakarta',
  timeZoneName: 'short'
}
const formater = new Intl.DateTimeFormat('sv-SE', options)
const startingDate = new Date("2012/04/10 10:10:30 +0000")

const dateInNewTimezone = formater.format(startingDate) 
console.log(dateInNewTimezone) // 12-04-10 17:10:30 GMT+7

오프셋, 일광 절약 및 과거의 변경 사항이 처리됩니다.


IE10 +는 표준 시간대에 대한 Intl API를 지원하지 않습니다. moment.github.io/luxon/docs/manual/matrix.html
— 클로

이것이 실제로 가장 좋은 대답입니다. toLocaleString일관되지 않은 구현이 있으며 IE11부터 작동합니다.
— dlsso

참고 : 이것은 실제로 Windows 8.1 이상에서는 IE11에서 작동하지 않습니다. 당신이 만들려고 할 때 formatter개체를, 당신이 얻을 :```옵션 값 'timeZone가'에 대한 '아시아 / 자카르타는'유효 범위를 벗어납니다. 예상 : [ 'UTC']```
— veddermatic

포맷터의 최종 결과를 다시 Date 객체로 변환하는 방법이 있습니까?
— mding5692

10

알았다 !

표시된 날짜 = 서버 날짜를 강제하고 싶었으므로 로컬 설정 (UTC)이 중요하지 않습니다.

내 서버는 GMT-6-> new Date (). getTimezoneOffset () = 360입니다.

myTZO = 360;
myNewDate=new Date(myOldDateObj.getTime() + (60000*(myOldDateObj.getTimezoneOffset()-myTZO)));
alert(myNewDate);

2
올바른 순진 시간을 표시하지만 myOldDateObj의 시간대 정보가 유지됩니다. 따라서 실제로 시간이 잘못되었습니다 (시계로 시간이 아닌 시간으로 인스턴스화하는 경우).
— gabn88

@ gabn88 : Javascript를 사용하여 서버 시간을 변경할 수 없습니다 ... 서버 시간을 수정하려면 운영 체제 수준에서 수행하십시오.
— Cedric Simon

2
서버 시간을 수정할 필요는 없습니다.;) 서버 시간은 항상 UTC입니다. 그러나 나는 다른 시간대로 다른 조직을 가지고 있습니다. 또한 장치는 항상 조직의 위치와 시간을 항상 표시해야합니다.
— gabn88

우리는 날짜를 항상 X 시간대로 보여주는 비슷한 문제를 겪습니다. 우리는 서버에서 모든 날짜를 문자열 형식으로 보내려고 시도하고 브라우저에서는 날짜를 현지 시간대 날짜로 취급합니다.
— Venkateswara Rao

5

시간대를 설정하기 위해 toLocaleString () 메소드를 사용할 수 있습니다.

new Date().toLocaleString('en-US', { timeZone: 'Indian/Christmas' })

인도의 경우 "인도 / 크리스마스"를 사용할 수 있으며 다음은 다양한 시간대입니다.

"Antarctica/Davis",
    "Asia/Bangkok",
    "Asia/Hovd",
    "Asia/Jakarta",
    "Asia/Phnom_Penh",
    "Asia/Pontianak",
    "Asia/Saigon",
    "Asia/Vientiane",
    "Etc/GMT-7",
    "Indian/Christmas"

timeZone을 설정하지 않고 해당 timeZone에 표시된 시간으로 문자열을 생성합니다. 날짜는 동일하게 유지됩니다.
— Gerard ONeill


4

시간대를 변환 해야하는 경우 최소한의 기능만으로 제거 된 모멘트 시간대의 버전 을 업로드했습니다 . ~ 1KB + 데이터 :

S.loadData({
    "zones": [
        "Europe/Paris|CET CEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|11e6",
        "Australia/Sydney|AEDT AEST|-b0 -a0|01010101010101010101010|1GQg0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|40e5",
    ],
    "links": [
        "Europe/Paris|Europe/Madrid",
    ]
});

let d = new Date();
console.log(S.tz(d, "Europe/Madrid").toLocaleString());
console.log(S.tz(d, "Australia/Sydney").toLocaleString());

2

연도, 월, 일을 '-'기호로 구분하고 'T'와 HH : mm : ss 패턴의 시간으로 변수를 설정 한 다음 문자열 끝에 +01 : 00을 입력하십시오 (제 경우에는 시간대는 +1)입니다. 그런 다음이 문자열을 날짜 생성자의 인수로 사용하십시오.

//desired format: 2001-02-04T08:16:32+01:00
dateAndTime = year+"-"+month+"-"+day+"T"+hour+":"+minutes+":00+01:00";

var date = new Date(dateAndTime );

2

사용할 수있는 외부 라이브러리는 제한되어 있습니다. moment.js와 timezone-js는 옵션이 아니 었습니다.

내가 가진 js 날짜 객체는 UTC입니다. 특정 시간대 (이 경우 '미국 / 시카고')에서이 날짜의 날짜와 시간을 가져와야했습니다.

 var currentUtcTime = new Date(); // This is in UTC

 // Converts the UTC time to a locale specific format, including adjusting for timezone.
 var currentDateTimeCentralTimeZone = new Date(currentUtcTime.toLocaleString('en-US', { timeZone: 'America/Chicago' }));

 console.log('currentUtcTime: ' + currentUtcTime.toLocaleDateString());
 console.log('currentUtcTime Hour: ' + currentUtcTime.getHours());
 console.log('currentUtcTime Minute: ' + currentUtcTime.getMinutes());
 console.log('currentDateTimeCentralTimeZone: ' +        currentDateTimeCentralTimeZone.toLocaleDateString());
 console.log('currentDateTimeCentralTimeZone Hour: ' + currentDateTimeCentralTimeZone.getHours());
 console.log('currentDateTimeCentralTimeZone Minute: ' + currentDateTimeCentralTimeZone.getMinutes());

UTC는 현재 '미국 / 시카고'보다 6 시간 빠릅니다. 출력은 다음과 같습니다

currentUtcTime: 11/25/2016
currentUtcTime Hour: 16
currentUtcTime Minute: 15

currentDateTimeCentralTimeZone: 11/25/2016
currentDateTimeCentralTimeZone Hour: 10
currentDateTimeCentralTimeZone Minute: 15

11
new Date();UTC가 아닌 현지 시간대로 돌아 가기
— Mirko

1
문서에서 :If no arguments are provided, the constructor creates a JavaScript Date object for the current date and time according to system settings.
— Mirko

흠. 혼란 스럽습니다. 날짜의 시간대는 변경되지 않습니다. 오히려 변경된 시간으로 새로운 날짜를 만듭니다. toLocaleString 호출에서 작성된 문자열에서 원하는 값을 추출하기 위해 정규식을 사용하는 것이 훨씬 더 명확합니다.
— Gerard ONeill

2

여기 내 코드가 있습니다. 완벽하게 작동합니다. 아래 데모를 시도해보십시오.

$(document).ready(function() {
   //EST
setInterval( function() {
var estTime = new Date();
 var currentDateTimeCentralTimeZone = new Date(estTime.toLocaleString('en-US', { timeZone: 'America/Chicago' }));
var seconds = currentDateTimeCentralTimeZone.getSeconds();
var minutes = currentDateTimeCentralTimeZone.getMinutes();
var hours =  currentDateTimeCentralTimeZone.getHours()+1;//new Date().getHours();
 var am_pm = currentDateTimeCentralTimeZone.getHours() >= 12 ? "PM" : "AM";

if (hours < 10){
     hours = "0" + hours;
}

if (minutes < 10){
     minutes = "0" + minutes;
}
if (seconds < 10){
     seconds = "0" + seconds;
}
    var mid='PM';
    if(hours==0){ //At 00 hours we need to show 12 am
    hours=12;
    }
    else if(hours>12)
    {
    hours=hours%12;
    mid='AM';
    }
    var x3 = hours+':'+minutes+':'+seconds +' '+am_pm
// Add a leading zero to seconds value
$("#sec").html(x3);
},1000);


});
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<p class="date_time"><strong id="sec"></strong></p>
</body>
</html>


StackOverflow에 오신 것을 환영합니다! 이 코드의 작동 방식 및 기능과 같은 추가 정보를 제공 할 수 있습니까? 문제를 어떻게 해결합니까?
— DarkSuniuM

위의 코드는 시간대를 다른 국가 시간대로 업데이트하는 것입니다.
— Sahil Kapoor

HTML을 html 파일에 넣고 위의 jquery 코드가 바닥 글에 있어야합니다. 다른 국가의 시간대 감사하려는 경우,이 두 값을 업데이트해야합니다 : 그것은 ({ '미국 / 시카고'timeZone가} 'EN-US')에 따라 당신을 위해 작동합니다
— 사힐 카푸어

기다리지 마 난 그냥 조심스럽게 보지 않고 이것을 upvoted. 왜 1을 추가 currentDateTimeCentralTimeZone.getHours()합니까? 이 seeking27의 응답으로 동일하게 작동하고있다 것없이 stackoverflow.com/a/40809160/1404185
— chetstone

1

날짜 시간대를 인도로 변환하기 위해 이것을 시도 할 수도 있습니다.

var indianTimeZoneVal = new Date().toLocaleString('en-US', {timeZone: 'Asia/Kolkata'});
var indainDateObj = new Date(indianTimeZoneVal);
indainDateObj.setHours(indainDateObj.getHours() + 5);
indainDateObj.setMinutes(indainDateObj.getMinutes() + 30);
console.log(indainDateObj);

1
2 단계 자체 후 인도에서 시간을 얻습니다 ... 그래서 왜 여전히 5 & 1/2 시간을 추가합니까?
— user3833732

이 방법을 사용할 때 Chrome으로 로그를 콘솔하면 노르웨이에서 다음을 얻습니다. 원본 : Thu Sep 27 2018 15:53:46 GMT + 0200 (중앙 유럽 위험). 수정 : Thu Sep 27 2018 19:23:46 GMT + 0200 (중앙 유럽 위험). "중앙 유럽 위험은"중부 유럽 서머 타임을 의미합니다. 인도에 서머 타임이 필요할 때 작동하는지, 또는 인도에 서 유럽에 서머 타임이 필요할 때도 마찬가지인지 확실하지 않습니다.
— Kebman

이와 같이 setHours ()를 사용하면 일, 월, 연도 전환을 고려하지 않습니다. 예를 들어 8 일 New Dell에서 오전 3시 30 분은 런던에서 7 일 오후 11시입니다. 그런 다음 달, 연도 및 윤년의 끝을 고려하십시오. 날짜에 수학을 쓰도록 <pre> let local_time = new Date (zulu_time.getTime () + 3600000 * std_timezone.timezone_factor-60 * 60 * 1000); date_str = local_time.toISOString (). slice (0, 10); let time_str = local_time.toISOString (). slice (11, -1); let timezone_str = std_timezone.timezone_str; </ pre>
— Lincoln Randall McFarland

1

이 페이지의 링크를 포함하여 많은 것을 둘러 본 순간 순간 시간대를 사용 하여이 훌륭한 기사를 찾았습니다.

https://www.webniraj.com/2016/11/23/javascript-using-moment-js-to-display-dates-times-in-users-timezone/

요약하면 다음과 같습니다.

사용자의 시간대를 가져옵니다

var tz = moment.tz.guess();
console.info('Timezone: ' + tz);

예 : 시간대 : 유럽 / 런던

기본 사용자 시간대 설정

moment.tz.setDefault(tz);

맞춤 시간대 설정

moment.tz.setDefault('America/Los_Angeles');

날짜 / 시간을 현지 시간대로 변환, 원래 날짜 / 시간이 UTC로 가정

moment.utc('2016-12-25 07:00').tz(tz).format('ddd, Do MMMM YYYY, h:mma');

반환 : 2016 년 12 월 25 일 일요일 오전 7시

날짜 / 시간을 LA 시간으로 변환

moment.utc('2016-12-25 07:00').tz('America/Los_Angeles').format('ddd, Do MMMM YYYY, h:mma');

반환 : 2016 년 12 월 24 일 토요일 오후 11:00

LA에서 런던으로 변환

moment.tz('2016-12-25 07:00', 'America/Los_Angeles').tz('Europe/London').format( 'ddd, Do MMMM YYYY, h:mma' );

반환 : 2016 년 12 월 25 일 일요일 오후 3시


1

https://www.npmjs.com/package/ctoc_timezone 을 사용할 수도 있습니다

훨씬 간단한 구현 및 형식 사용자 지정이 가능합니다.

toTimeZone에서 형식 변경 :

CtoC.toTimeZone(new Date(),"EST","Do MMM YYYY hh:mm:ss #{EST}");

출력 :

28th Feb 2013 19:00:00 EST

문서에서 여러 기능을 탐색 할 수 있습니다.


0

이를 위해 사용할 수있는 'timezones.json'이라는 npm 모듈이 있습니다. 기본적으로 일광 절약 및 오프셋에 대한 정보가 포함 된 객체가 포함 된 json 파일로 구성됩니다.

아시아 / 자카르타의 경우이 객체를 반환 할 수 있습니다.

{
  "value": "SE Asia Standard Time",
  "abbr": "SAST",
  "offset": 7,
  "isdst": false,
  "text": "(UTC+07:00) Bangkok, Hanoi, Jakarta",
  "utc": [
    "Antarctica/Davis",
    "Asia/Bangkok",
    "Asia/Hovd",
    "Asia/Jakarta",
    "Asia/Phnom_Penh",
    "Asia/Pontianak",
    "Asia/Saigon",
    "Asia/Vientiane",
    "Etc/GMT-7",
    "Indian/Christmas"
  ]
}

여기에서 찾을 수 있습니다.

https://github.com/dmfilipenko/timezones.json

https://www.npmjs.com/package/timezones.json

유용하길 바래


0

java 8 java.time패키지에 익숙한 사람들 joda-time은 아마도 js-joda 라이브러리 의 새로운 아이를 좋아할 것입니다 .

설치

npm install js-joda js-joda-timezone --save

예

<script src="node_modules/js-joda/dist/js-joda.js"></script>
<script src="node_modules/js-joda-timezone/dist/js-joda-timezone.js"></script>
<script>
var dateStr = '2012/04/10 10:10:30 +0000';
JSJoda.use(JSJodaTimezone);
var j = JSJoda;
// https://js-joda.github.io/js-joda/esdoc/class/src/format/DateTimeFormatter.js~DateTimeFormatter.html#static-method-of-pattern
var zonedDateTime = j.ZonedDateTime.parse(dateStr, j.DateTimeFormatter.ofPattern('yyyy/MM/dd HH:mm:ss xx'));
var adjustedZonedDateTime = zonedDateTime.withZoneSameInstant(j.ZoneId.of('America/New_York'));
console.log(zonedDateTime.toString(), '=>', adjustedZonedDateTime.toString());
// 2012-04-10T10:10:30Z => 2012-04-10T06:10:30-04:00[America/New_York]
</script>

진정한 Java 본질에서는 꽤 장황합니다. 그러나 이식 된 Java 라이브러리 인 경우, 특히 1800'ish 테스트 사례를 이식 한 것을 고려할 때 아마도 매우 정확하게 작동합니다.

크로노 조작이 어렵다. 그렇기 때문에 다른 많은 라이브러리가 가장자리가 까다로운 이유입니다. Moment.js는 시간대를 올바르게 얻는 것처럼 보이지만을 포함하여 내가 본 다른 JS 라이브러리 timezone-js는 신뢰할 수없는 것으로 보입니다.


0

나는 최근에 Typescript에서 이것을했다 :

// fromTimezone example : Europe/Paris, toTimezone example: Europe/London
private calcTime( fromTimezone: string, toTimezone: string, dateFromTimezone: Date ): Date {
  const dateToGetOffset = new Date( 2018, 5, 1, 12 );

  const fromTimeString = dateToGetOffset.toLocaleTimeString( "en-UK", { timeZone: fromTimezone, hour12: false } );
  const toTimeString = dateToGetOffset.toLocaleTimeString( "en-UK", { timeZone: toTimezone, hour12: false } );

  const fromTimeHours: number = parseInt( fromTimeString.substr( 0, 2 ), 10 );
  const toTimeHours: number = parseInt( toTimeString.substr( 0, 2 ), 10 );

  const offset: number = fromTimeHours - toTimeHours;

  // convert to msec
  // add local time zone offset
  // get UTC time in msec
  const dateFromTimezoneUTC = Date.UTC( dateFromTimezone.getUTCFullYear(),
    dateFromTimezone.getUTCMonth(),
    dateFromTimezone.getUTCDate(),
    dateFromTimezone.getUTCHours(),
    dateFromTimezone.getUTCMinutes(),
    dateFromTimezone.getUTCSeconds(),
  );

  // create new Date object for different city
  // using supplied offset
  const dateUTC = new Date( dateFromTimezoneUTC + ( 3600000 * offset ) );

  // return time as a string
  return dateUTC;
}

"en-UK"형식은 단순하기 때문에 사용합니다. "en-US"일 수도 있고 작동 할 수도 있습니다.

첫 번째 인수가 로케일 시간대이고 두 번째 인수가 대상 시간대 인 경우 올바른 오프셋으로 Date 객체를 반환합니다.


0

순간 시간대를 사용하는 데 문제가있었습니다 . 다른 사람이 같은 문제에 직면하면이 답변을 추가하고 있습니다. 그래서 2018-06-14 13:51:00내 날짜 문자열 이 있습니다 API. 나는 이것이 저장된다는 것을 알고있다.UTC 있지만 문자열 자체를 말하지 않는다는 있습니다.

나는 시간대를 알려줌으로써이 날짜의 시간대는 다음과 같습니다.

let uTCDatetime = momentTz.tz("2018-06-14 13:51:00", "UTC").format();
// If your datetime is from any other timezone then add that instead of "UTC"
// this actually makes the date as : 2018-06-14T13:51:00Z

이제 다음을 수행하여 특정 시간대로 변환하고 싶습니다.

let dateInMyTimeZone = momentTz.tz(uTCDatetime, "Asia/Kolkata").format("YYYY-MM-DD HH:mm:ss");
// now this results into: 2018-06-14 19:21:00, which is the corresponding date in my timezone.

0

원하는 국가 시간대를 설정하기 만하면 html로 쉽게 표시 할 수 있으며 매 분마다 SetInteval () 함수를 사용하여 업데이트됩니다. AMPM () 함수는 12 시간 형식과 AM / PM 시간 표시를 관리합니다.

$(document).ready(function(){
        var pakTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Karachi"});
        pakTime = new Date(pakTime);

        var libyaTime = new Date().toLocaleString("en-US", {timeZone: "Africa/Tripoli"});
        libyaTime = new Date(libyaTime);



         document.getElementById("pak").innerHTML = "PAK  "+formatAMPM(pakTime);
         document.getElementById("ly").innerHTML = "LY   " +formatAMPM(libyaTime);

        setInterval(function(today) {
            var pakTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Karachi"});
            pakTime = new Date(pakTime);

            var libyaTime = new Date().toLocaleString("en-US", {timeZone: "Africa/Tripoli"});
            libyaTime = new Date(libyaTime);


           document.getElementById("pak").innerHTML = "PAK  "+formatAMPM(pakTime);
           document.getElementById("ly").innerHTML = "LY  " +formatAMPM(libyaTime);

        },10000);

         function formatAMPM(date) {
            var hours = date.getHours();
            var minutes = date.getMinutes();
            var ampm = hours >= 12 ? 'pm' : 'am';
            hours = hours % 12;
            hours = hours ? hours : 12; // the hour '0' should be '12'
            minutes = minutes < 10 ? '0'+minutes : minutes;
            var strTime = hours + ':' + minutes + ' ' + ampm;
            return strTime;
        }


    });

-1

날짜 개체를 표준 시간대로 변환하는 쉬운 방법을 모르지만 로컬 표준 시간대로 변환 Date.prototype.getTime()하려면 해당 밀리 초 단위 로 변환 하고 다시 되돌릴 수 있습니다.

date = new Date('2016-05-24T13:07:20');
date = new Date(date.getTime());

예를 들어, date.getHours()지금 돌아갑니다 15대신 13오스트리아, 나 같은, 당신이 경우 (그리고 그것의 여름).

다양한 날짜 시간 함수가 일부 브라우저에서 비표준 동작을 나타낼 수 있으므로 먼저 테스트하십시오. Chrome에서 작동하는지 확인할 수 있습니다.


1
왜 투표가 거부 되었습니까? 이것이 지금까지 가장 쉽고 가장 좋은 방법입니다. 위의 답변 대부분은 여름 / 겨울 시간을 고려하지 않습니다
— MortenSickel

두 번째 줄의 요점은 무엇입니까? 날짜 생성자는 현지 시간대가 이미 있다고 가정합니다. 이 두 줄 모두 로컬 브라우저 시간대로 날짜를 반환하며 일광 절약 시간으로 다른 시간대로 변환하는 방법에 대한 질문에 대답하지 않습니다.
— Chloe

-1

현재 시간대의 시간대 오프셋

date +%s -d '1 Jan 1970'

내 GMT + 10 시간대 (호주)의 경우 -36000을 반환했습니다.


-6

빠르고 더러운 수동 시간 교환기 및 반환 :

return new Date(new Date().setHours(new Date().getHours()+3)).getHours()

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