한 시간대의 날짜를 다른 시간대로 변환하는 함수를 찾고 있습니다.
두 개의 매개 변수가 필요합니다.
- 날짜 ( "2012/04/10 10:10:30 +0000"형식)
- 시간대 문자열 ( "아시아 / 자카르타")
시간대 문자열은 http://en.wikipedia.org/wiki/Zone.tab에 설명되어 있습니다 .
이 작업을 수행하는 쉬운 방법이 있습니까?
한 시간대의 날짜를 다른 시간대로 변환하는 함수를 찾고 있습니다.
두 개의 매개 변수가 필요합니다.
시간대 문자열은 http://en.wikipedia.org/wiki/Zone.tab에 설명되어 있습니다 .
이 작업을 수행하는 쉬운 방법이 있습니까?
답변:
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
toLocaleString
것을 보여 주지만 해당 문자열을 Date
생성자 로 다시 전달하는 것은 매우 잘못 표시합니다 . 그것은 문제를 요구하고 있습니다. 날짜 문자열 구문 분석기는 로케일 특정 형식을 승인하지 않아도되며 입력은 마치 현지 시간대 인 것처럼 처리됩니다. 하지마 첫 번째 toLocalString
호출 의 문자열 출력 만 사용하십시오 .
들어 moment.js의 사용자, 당신은 지금 사용할 수있는 순간 시간대를 . 그것을 사용하면 함수는 다음과 같습니다.
function toTimeZone(time, zone) {
var format = 'YYYY/MM/DD HH:mm:ss ZZ';
return moment(time, format).tz(zone).format(format);
}
Date.prototype.toLocaleString
.
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' })
toLocaleStringSupportsLocales()
지원을 안정적으로 확인할 수 있는 구현이 있습니다.
알았어!
내가 사용하고 시간대-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
큰 라이브러리를 가져 오지 않으려면 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
오프셋, 일광 절약 및 과거의 변경 사항이 처리됩니다.
toLocaleString
일관되지 않은 구현이 있으며 IE11부터 작동합니다.
formatter
개체를, 당신이 얻을 :```옵션 값 'timeZone가'에 대한 '아시아 / 자카르타는'유효 범위를 벗어납니다. 예상 : [ 'UTC']```
알았다 !
표시된 날짜 = 서버 날짜를 강제하고 싶었으므로 로컬 설정 (UTC)이 중요하지 않습니다.
내 서버는 GMT-6-> new Date (). getTimezoneOffset () = 360입니다.
myTZO = 360;
myNewDate=new Date(myOldDateObj.getTime() + (60000*(myOldDateObj.getTimezoneOffset()-myTZO)));
alert(myNewDate);
시간대를 설정하기 위해 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"
toLocaleString
솔루션은 이미 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());
사용할 수있는 외부 라이브러리는 제한되어 있습니다. 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
new Date();
UTC가 아닌 현지 시간대로 돌아 가기
If no arguments are provided, the constructor creates a JavaScript Date object for the current date and time according to system settings.
여기 내 코드가 있습니다. 완벽하게 작동합니다. 아래 데모를 시도해보십시오.
$(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>
currentDateTimeCentralTimeZone.getHours()
합니까? 이 seeking27의 응답으로 동일하게 작동하고있다 것없이 stackoverflow.com/a/40809160/1404185
날짜 시간대를 인도로 변환하기 위해 이것을 시도 할 수도 있습니다.
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);
이 페이지의 링크를 포함하여 많은 것을 둘러 본 순간 순간 시간대를 사용 하여이 훌륭한 기사를 찾았습니다.
요약하면 다음과 같습니다.
사용자의 시간대를 가져옵니다
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
유용하길 바래
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
는 신뢰할 수없는 것으로 보입니다.
나는 최근에 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 객체를 반환합니다.
순간 시간대를 사용하는 데 문제가있었습니다 . 다른 사람이 같은 문제에 직면하면이 답변을 추가하고 있습니다. 그래서 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.
원하는 국가 시간대를 설정하기 만하면 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;
}
});
날짜 개체를 표준 시간대로 변환하는 쉬운 방법을 모르지만 로컬 표준 시간대로 변환 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()