web-dev-qa-db-ja.com

JavaScriptで日付を別のタイムゾーンに変換する

あるタイムゾーンの日付を別のタイムゾーンに変換する機能を探しています。

2つのパラメータが必要です。

  • 日付(「2012/04/10 10:10:30 +0000」の形式)
  • タイムゾーン文字列( "Asia/Jakarta")

タイムゾーン文字列は http://en.wikipedia.org/wiki/Zone.tab に記載されています。

これを行う簡単な方法はありますか?

244
Rizky Ramadhan
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

40
Udhaya

moment.js usersの場合は、 moment-timezone を使用できます。それを使用すると、あなたの関数は次のようになります。

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

Safariを除くほとんどのデスクトップ(モバイルではない)ブラウザは引数付きで toLocaleString 関数をサポートしますが、古いブラウザでは通常引数を無視します。

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

から恥知らずに盗まれた: 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();
}

この機能は、市/国の名前とオフセット値を指定してタイムゾーン値を計算するのに役立ちます。

83
Valli69

さて、見つけました!

timezone-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
57
Rizky Ramadhan

とった !

ローカル設定(UTC)に関係なく、表示されている日付=サーバーの日付を強制したいと考えていました。

私のサーバーはGMT-6 - > new Date()。getTimezoneOffset()= 360です。

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

大きなライブラリをインポートしたくないのであれば、 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

オフセット、夏時間、および過去の変更はあなたの世話をします。

5
Endless

タイムゾーンを設定するためにtoLocaleString()メソッドを使用することができます。

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

インドでは "Indian/Christmas"を使うことができ、以下はさまざまなタイムゾーンです。

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

あなたがちょうどタイムゾーンを変換する必要があるならば、私は 省略されたバージョンをアップロードしました / - moment-timezone ちょうど最小限のfunctionallityで。その〜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());
4

これが私のコードです、それは完全に働いています、あなたは以下のデモを与えることで試すことができます:

$(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>
4
Sahil Kapoor

年、月、日を ' - '記号で区切って変数に設定し、さらに '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
Nather Webber

このページからのリンクを含むたくさんのことを見回して、私は瞬間のタイムゾーンを使って、この素晴らしい記事を見つけました:

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:00

日付/時刻をLA時間に変換

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

戻り値:2016年12月24日(土)午後11時

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時

2
omarjebari

私はどの外部ライブラリを使用できるかに関して制限があることに注意しなければなりません。 moment.jsとtimezone-jsは私にとって選択肢ではありませんでした。

私が持っているjs dateオブジェクトはUTCです。私は特定のタイムゾーン(私の場合は 'America/Chicago')でこの日付から日付と時刻を取得する必要がありました。

 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
2
seeking27

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

あなたはドキュメントで複数の機能を探索することができます。

2

あなたは、インドへの日付のタイムゾーンの変換のためにこれを試すことができます。

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
Rahul Mankar

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年代のテストケースを移植したことを考えると、それはおそらく非常に正確に機能します。

クロノ操作は難しいです。だからこそ、他の多くのライブラリがEdgeのケースでバグがあるのです。 Moment.jsはタイムゾーンを正しくしているようですが、私が見た他のjsライブラリ(timezone-jsを含む)は信頼できないようです。

1
goat

Moment Timezone を使用できませんでした。他の誰かが同じ問題に直面しているのであれば、私はこの答えを追加しています。だから私は私のAPIから来る日付文字列2018-06-14 13:51:00を持っています。これは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.
1
xyz

これに使用できる '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

便利だと思います

1
Kevin

私は最近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」またはどんな作品でもあり得たでしょう。

最初の引数がロケールのタイムゾーンで、secondeがターゲットのタイムゾーンの場合、正しいオフセットを持つDateオブジェクトが返されます。

0

現在のタイムゾーンのタイムゾーンオフセット

date +%s -d '1 Jan 1970'

私のGMT + 10タイムゾーン(オーストラリア)では、-36000が返されました

0
anthony