あるタイムゾーンの日付を別のタイムゾーンに変換する関数を探しています。
2つのパラメーターが必要です。
- 日付(「2012/04/10 10:10:30 +0000」の形式)
- タイムゾーン文字列( "Asia / Jakarta")
タイムゾーン文字列は、http://en.wikipedia.org/wiki/Zone.tabで説明されています
これを行う簡単な方法はありますか?
あるタイムゾーンの日付を別のタイムゾーンに変換する関数を探しています。
2つのパラメーターが必要です。
タイムゾーン文字列は、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()
ますが、確実にサポートするためにチェックすることができます実装を。
わかった!
私は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
大きなライブラリをインポートしたくない場合は、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'のオプション値 'Asia / Jakarta'が有効範囲外です。予想:['UTC'] `` `
とった !
表示されている日付を強制したい=サーバーの日付、ローカル設定(UTC)は重要ではありません。
私のサーバーはGMT-6->新しい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' })
インドの場合、「Indian / Christmas」を使用でき、以下はさまざまなtimeZonesです。
"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時
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ファイルで構成されています。
asia / jakartaの場合、このオブジェクトを返すことができます。
{
"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年代のテストケースを移植したことを考えると、おそらく非常に正確に機能します。
クロノ操作は難しいです。他の多くのライブラリがエッジケースでバグがあるのはそのためです。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」または何でも機能する可能性があります。
最初の引数がロケールのタイムゾーンであり、secondeがターゲットのタイムゾーンである場合、正しいオフセットの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.
希望する国のタイムゾーンを設定するだけで、1分ごとにSetInteval()関数を使用して更新をHTMLで簡単に表示できます。関数formatAMPM()は、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で動作することを確認できました。
1つのアプローチは、特定の時間の新しいタイムゾーンのオフセットを計算することです。
この質問の正確な直接的な解決策ではありませんが、私のユースケースでは、文字列出力では不可能だった結果の時間を使って計算を行う必要がありました。ここでは、すべての人に関数を残しておきます。
これは、Nodeおよび主要な最新のブラウザーで機能するコアロジックにすぎません。
function getTimezoneOffset(unixtime, timezone){
// Convert Unix Time to Data Object
var date = new Date(unixtime * 1000);
// Define Options for Formatter
var options = {
year: 'numeric', month: 'long', day: '2-digit',
hour: '2-digit', minute: '2-digit', second: '2-digit',
timeZone: timezone
};
// Get Date in New Timezone
var new_date_string = Intl.DateTimeFormat(void 0, options).format(date); // Output: May 15, 2020, 02:40:12 AM
// New Time in Seconds with Error-Fix for Date Conversion
var time_with_fix = (
( new Date(new_date_string) ).getTime() / 1000 - // Convert Date into Seconds (In Local Timezone)
( new Date().getTimezoneOffset() * 60 ) // Local Timezone Offset in Seconds
);
// Return Timezone Offset
return ( time_with_fix - unixtime ); // Return Offset in Seconds
};
///////////////////////////TEST/////////////////////////////////
var current_time = Math.floor( new Date().getTime()/1000 );
console.log(
"getTimezoneOffset(current_time, 'America/New_York'):",
getTimezoneOffset(current_time, 'America/New_York')/3600
);
console.log(
"getTimezoneOffset(current_time, 'Australia/Sydney'):",
getTimezoneOffset(current_time, 'Australia/Sydney')/3600
);
迅速で汚れた手動アワーチェンジャーとリターン:
return new Date(new Date().setHours(new Date().getHours()+3)).getHours()