Programing

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

lottogame 2020. 3. 22. 10:37
반응형

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


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

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

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

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

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


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

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

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

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

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


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

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

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();
}

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


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

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

알았어!

내가 사용하고 시간대-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

알았다 !

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

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

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

큰 라이브러리를 가져 오지 않으려면 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

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


시간대를 변환 해야하는 경우 최소한의 기능만으로 제거모멘트 시간대의 버전업로드했습니다 . ~ 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());

시간대를 설정하기 위해 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"

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

$(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>


연도, 월, 일을 '-'기호로 구분하고 '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 );

사용할 수있는 외부 라이브러리는 제한되어 있습니다. 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

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

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시


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

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


이를 위해 사용할 수있는 '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

유용하길 바래


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

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);

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 라이브러리 인 경우, 특히 1800 년대의 테스트 사례를 이식 한 것을 고려할 때 아마도 매우 정확하게 작동합니다.

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


순간 시간대를 사용하는 데 문제가있었습니다 . 다른 사람이 같은 문제에 직면하면이 답변을 추가하고 있습니다. 그래서 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.

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

date +%s -d '1 Jan 1970'

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


나는 최근에 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 객체를 반환합니다.


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

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

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

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


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

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

참고 URL : https://stackoverflow.com/questions/10087819/convert-date-to-another-timezone-in-javascript

반응형