Dize temsili kullanmadan ayarlanmış bir saat dilimiyle Tarih oluşturma


412

Gün, ay ve yıl için üç açılan web sayfam var. DateSayıları alan JavaScript yapıcısını kullanırsam, Dategeçerli saat dilimim için bir nesne alırım :

new Date(xiYear, xiMonth, xiDate)

Doğru tarihi verin, ancak gün ışığından yararlanma saati nedeniyle tarihin GMT + 01: 00 olduğunu düşünüyor.

Burada sorun daha sonra Datebir Ajax yöntemine geçmek ve tarih sunucuda serisini kaldırıldığında zaman GMT dönüştürülmüş ve böylece bir gün geri hareket bir saat kaybetti olmasıdır. Şimdi gün, ay ve yılı ayrı ayrı Ajax yöntemine geçirebildim, ancak daha iyi bir yol olması gerektiği anlaşılıyor.

Kabul edilen cevap bana doğru yönü gösterdi, ancak sadece setUTCHours()kendi başına kullanmak değişti:

Apr 5th 00:00 GMT+01:00 

için

Apr 4th 23:00 GMT+01:00

Daha sonra sona ermek için UTC tarihini, ayını ve yılını ayarlamak zorunda kaldım

Apr 5th 01:00 GMT+01:00

istediğim buydu.


9
Eğer kabul edilen cevap size doğru yönü gösteriyorsa, ancak sorunuzu cevaplamıyorsa, kabul edilen cevap olmaması gerektiğini savunuyorum. Cevap, sorulan soruya cevap vermelidir.
TWR Cole

Yanıtlar:


481

kullanarak .setUTCHours()bunu size sistem boyunca UTC-sürelerini kullanmasına izin vereceğini UTC zamanlı fiilen belirlenen tarihlerde, mümkün olacaktır.

Bir tarih dizesi belirtmedikçe yapıcıda UTC kullanarak ayarlayamazsınız.

Kullanarak new Date(Date.UTC(year, month, day, hour, minute, second))belirli bir UTC saatinden bir Date nesnesi oluşturabilirsiniz.


101
"New Date (Date.UTC (...))" sözdizimi, temsil ettiği saat cinsinden UTC tarihine eşdeğer bir tarih oluşturmanıza olanak tanır , ancak aynı değildir - farklı (UTC olmayan) saat dilimi.
Anthony

52
"Tarih" kullanılırken "ay" değerinin 0-11 (1-12 değil) aralığında olduğunu unutmayın. Ben (1 saat olması gerekirken) 2 saat bir saat dilimi ofset elde etti ve neden yanlış bir ay olduğunu bulmak için bana saatler sürdü.
Seç

4
Bu cevap harika. Ama birçok yerde yeni Tarih kullanan bir kütüphane [datepicker ui] kullanıyorum. Tek istediğim UTC saat dilimini ayarlamak ve her tarih yeni saat dilimine göre. Javascript bunun için hiçbir şey yok şaşırdım.
Sanjeev Kumar Dangi

6
@ jishi — Tarih nesneleri yerel saate değil, UTC saat değerine dayanır. Ancak, varsayılan Date.prototype.toString yöntemi olacaktır gösterilecek yerel saat değerleri.
RobG

5
@ Anthony - " ama aynı zamanda değil" doğru değil. Tam olarak aynı anı temsil eder, tek fark saat dilimi farkıdır.
RobG

198
var d = new Date(xiYear, xiMonth, xiDate);
d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );

Bu cevap özellikle orijinal soruya uyarlanmıştır ve mutlaka beklediğiniz cevabı vermeyecektir. Özellikle, bazı insanlar saat dilimi ofsetini eklemek yerine çıkarmak isteyecektir. Yine de, bu çözümün asıl amacının, her durumda doğru olmamak için javascript'in tarih nesnesini belirli bir serileştirme için kesmek olduğunu unutmayın.


62
@gthmb tabii ki, ama *60*1000bu durumda bunun daha net olduğunu hissediyorum ; diğer bir deyişle, neden orada olduğu oldukça açıktır.
TWR Cole

22
Saat dilimim için doğru zamanı almak için + (artı) yerine - (eksi) kullanmam dışında bu neredeyse benim için çalışıyor.
Mart'ta Wytze

3
Evet, diğerlerinin de belirttiği gibi - bence bu cevapta bir hata var. Artı değil eksi olmalıdır.
UpTheCreek

3
Göre developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... getTimezoneOffset tarafından döndürülen değeri dikkate DST alarak dahil işlevini çağırmak anda yerdeki ofset fiili göre imzalanır, bu yüzden neden çıkartmanız gerektiğini anlamıyorum.
TWR Cole

15
Tarih nesnesine timezoneOffset öğesini eklerseniz, yerel saat diliminde biçimlendirilmiş değeri UTC'de doğru değere benzeyecektir, ancak yine de orijinal saat dilimi uzaklığına sahip olacaktır (ve "ISOString" gibi bazı gösterimler bunu gösterecektir). Tarih nesnesini nasıl serileştirdiğinize bağlı olarak, JS saat dilimi sapmasını yeniden uygulayarak size yanlış yanıtı verebilir. Bu yorumlarda +/- arasındaki karışıklıktan bunun sorumlu olduğuna inanıyorum. Neyse, benim downvote bu gerçek ve aynı zamanda "çoğu durumda ne beklediğiniz olsun" içindir.
metamatt

173

CreateDateAsUTC işlevine ihtiyacınız olduğuna inanıyorum (lütfen convertDateToUTC ile karşılaştırın )

function createDateAsUTC(date) {
    return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
}

function convertDateToUTC(date) { 
    return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); 
}

36
Onun cevap netliği ve yardımseverliği beni şaşırttı. Javascript tarihleriyle çalışmanın bugüne kadar böyle bir kabus olduğunu bilmiyordum: S
will824

İkisi arasındaki farkı açıklamak ister misiniz? Birincisi dateUTC saat dilimine dönüşüyor, ancak ikincisi yararlı bir şey yapmıyor gibi görünüyor mu? (aynı tarihi döndürür date)
Jonathan Lin

4
Şimdi anladım: Birincisi, yerel saatin gerçek tarih değerleri ile UTC saat dilimindeki tarihi döndürür. İkincisi, yerel saat dilimindeki tarihi, ancak UTC değişmez tarih değerleriyle döndürür.
Jonathan Lin

8
Bu yaklaşım, dönemi (UTC temelli) geçerli saat dilimi ofseti tarafından değiştirilen bir düzeye taşımak üzere tasarlanan "dönem kaydırma" adı verilen bir desenin bir uygulamasıdır. Ne yazık ki, bu yaygın olarak görülmesine rağmen, bu yaklaşım kusurludur. JavaScript'in Datenesnesi her zaman UTC tabanlı unix çağını ve yerel saat dilimini yansıtır . Belirti, toStringsonuç tarih nesnesini çağırdığınızda ve yerel saat dilimini gördüğünüzde, UTC'de olmasını bekleseniz bile belirgindir .
Matt Johnson-Pint

2
Ayrıca, yerel saat diliminin yaz saati uygulamasına yakın saat değerlerinde hatalara neden olabilir. Kısacası, çağ kaydırma (herhangi bir uygulama yoluyla) JavaScript Datenesnesiyle çalışmaz . Bunu burada görmenin başka bir yolu, Date.UTCUTC tabanlı değerleri beklemenizdir ve yerel zaman değerlerini beslersiniz ve bunun tersi de Datekurucu ile.
Matt Johnson-Pint

70

Basitçe Saat Dilimini Ayarlayın ve Geri Dönün

new Date().toLocaleString("en-US", {timeZone: "America/New_York"})

Diğer Zaman dilimleri aşağıdaki gibidir

var world_timezones =
[
    'Europe/Andorra',
    'Asia/Dubai',
    'Asia/Kabul',
    'Europe/Tirane',
    'Asia/Yerevan',
    'Antarctica/Casey',
    'Antarctica/Davis',
    'Antarctica/DumontDUrville', 
    'Antarctica/Mawson',
    'Antarctica/Palmer',
    'Antarctica/Rothera',
    'Antarctica/Syowa',
    'Antarctica/Troll',
    'Antarctica/Vostok',
    'America/Argentina/Buenos_Aires',
    'America/Argentina/Cordoba',
    'America/Argentina/Salta',
    'America/Argentina/Jujuy',
    'America/Argentina/Tucuman',
    'America/Argentina/Catamarca',
    'America/Argentina/La_Rioja',
    'America/Argentina/San_Juan',
    'America/Argentina/Mendoza',
    'America/Argentina/San_Luis',
    'America/Argentina/Rio_Gallegos',
    'America/Argentina/Ushuaia',
    'Pacific/Pago_Pago',
    'Europe/Vienna',
    'Australia/Lord_Howe',
    'Antarctica/Macquarie',
    'Australia/Hobart',
    'Australia/Currie',
    'Australia/Melbourne',
    'Australia/Sydney',
    'Australia/Broken_Hill',
    'Australia/Brisbane',
    'Australia/Lindeman',
    'Australia/Adelaide',
    'Australia/Darwin',
    'Australia/Perth',
    'Australia/Eucla',
    'Asia/Baku',
    'America/Barbados',
    'Asia/Dhaka',
    'Europe/Brussels',
    'Europe/Sofia',
    'Atlantic/Bermuda',
    'Asia/Brunei',
    'America/La_Paz',
    'America/Noronha',
    'America/Belem',
    'America/Fortaleza',
    'America/Recife',
    'America/Araguaina',
    'America/Maceio',
    'America/Bahia',
    'America/Sao_Paulo',
    'America/Campo_Grande',
    'America/Cuiaba',
    'America/Santarem',
    'America/Porto_Velho',
    'America/Boa_Vista',
    'America/Manaus',
    'America/Eirunepe',
    'America/Rio_Branco',
    'America/Nassau',
    'Asia/Thimphu',
    'Europe/Minsk',
    'America/Belize',
    'America/St_Johns',
    'America/Halifax',
    'America/Glace_Bay',
    'America/Moncton',
    'America/Goose_Bay',
    'America/Blanc-Sablon',
    'America/Toronto',
    'America/Nipigon',
    'America/Thunder_Bay',
    'America/Iqaluit',
    'America/Pangnirtung',
    'America/Atikokan',
    'America/Winnipeg',
    'America/Rainy_River',
    'America/Resolute',
    'America/Rankin_Inlet',
    'America/Regina',
    'America/Swift_Current',
    'America/Edmonton',
    'America/Cambridge_Bay',
    'America/Yellowknife',
    'America/Inuvik',
    'America/Creston',
    'America/Dawson_Creek',
    'America/Fort_Nelson',
    'America/Vancouver',
    'America/Whitehorse',
    'America/Dawson',
    'Indian/Cocos',
    'Europe/Zurich',
    'Africa/Abidjan',
    'Pacific/Rarotonga',
    'America/Santiago',
    'America/Punta_Arenas',
    'Pacific/Easter',
    'Asia/Shanghai',
    'Asia/Urumqi',
    'America/Bogota',
    'America/Costa_Rica',
    'America/Havana',
    'Atlantic/Cape_Verde',
    'America/Curacao',
    'Indian/Christmas',
    'Asia/Nicosia',
    'Asia/Famagusta',
    'Europe/Prague',
    'Europe/Berlin',
    'Europe/Copenhagen',
    'America/Santo_Domingo',
    'Africa/Algiers',
    'America/Guayaquil',
    'Pacific/Galapagos',
    'Europe/Tallinn',
    'Africa/Cairo',
    'Africa/El_Aaiun',
    'Europe/Madrid',
    'Africa/Ceuta',
    'Atlantic/Canary',
    'Europe/Helsinki',
    'Pacific/Fiji',
    'Atlantic/Stanley',
    'Pacific/Chuuk',
    'Pacific/Pohnpei',
    'Pacific/Kosrae',
    'Atlantic/Faroe',
    'Europe/Paris',
    'Europe/London',
    'Asia/Tbilisi',
    'America/Cayenne',
    'Africa/Accra',
    'Europe/Gibraltar',
    'America/Godthab',
    'America/Danmarkshavn',
    'America/Scoresbysund',
    'America/Thule',
    'Europe/Athens',
    'Atlantic/South_Georgia',
    'America/Guatemala',
    'Pacific/Guam',
    'Africa/Bissau',
    'America/Guyana',
    'Asia/Hong_Kong',
    'America/Tegucigalpa',
    'America/Port-au-Prince',
    'Europe/Budapest',
    'Asia/Jakarta',
    'Asia/Pontianak',
    'Asia/Makassar',
    'Asia/Jayapura',
    'Europe/Dublin',
    'Asia/Jerusalem',
    'Asia/Kolkata',
    'Indian/Chagos',
    'Asia/Baghdad',
    'Asia/Tehran',
    'Atlantic/Reykjavik',
    'Europe/Rome',
    'America/Jamaica',
    'Asia/Amman',
    'Asia/Tokyo',
    'Africa/Nairobi',
    'Asia/Bishkek',
    'Pacific/Tarawa',
    'Pacific/Enderbury',
    'Pacific/Kiritimati',
    'Asia/Pyongyang',
    'Asia/Seoul',
    'Asia/Almaty',
    'Asia/Qyzylorda',
    'Asia/Qostanay', 
    'Asia/Aqtobe',
    'Asia/Aqtau',
    'Asia/Atyrau',
    'Asia/Oral',
    'Asia/Beirut',
    'Asia/Colombo',
    'Africa/Monrovia',
    'Europe/Vilnius',
    'Europe/Luxembourg',
    'Europe/Riga',
    'Africa/Tripoli',
    'Africa/Casablanca',
    'Europe/Monaco',
    'Europe/Chisinau',
    'Pacific/Majuro',
    'Pacific/Kwajalein',
    'Asia/Yangon',
    'Asia/Ulaanbaatar',
    'Asia/Hovd',
    'Asia/Choibalsan',
    'Asia/Macau',
    'America/Martinique',
    'Europe/Malta',
    'Indian/Mauritius',
    'Indian/Maldives',
    'America/Mexico_City',
    'America/Cancun',
    'America/Merida',
    'America/Monterrey',
    'America/Matamoros',
    'America/Mazatlan',
    'America/Chihuahua',
    'America/Ojinaga',
    'America/Hermosillo',
    'America/Tijuana',
    'America/Bahia_Banderas',
    'Asia/Kuala_Lumpur',
    'Asia/Kuching',
    'Africa/Maputo',
    'Africa/Windhoek',
    'Pacific/Noumea',
    'Pacific/Norfolk',
    'Africa/Lagos',
    'America/Managua',
    'Europe/Amsterdam',
    'Europe/Oslo',
    'Asia/Kathmandu',
    'Pacific/Nauru',
    'Pacific/Niue',
    'Pacific/Auckland',
    'Pacific/Chatham',
    'America/Panama',
    'America/Lima',
    'Pacific/Tahiti',
    'Pacific/Marquesas',
    'Pacific/Gambier',
    'Pacific/Port_Moresby',
    'Pacific/Bougainville',
    'Asia/Manila',
    'Asia/Karachi',
    'Europe/Warsaw',
    'America/Miquelon',
    'Pacific/Pitcairn',
    'America/Puerto_Rico',
    'Asia/Gaza',
    'Asia/Hebron',
    'Europe/Lisbon',
    'Atlantic/Madeira',
    'Atlantic/Azores',
    'Pacific/Palau',
    'America/Asuncion',
    'Asia/Qatar',
    'Indian/Reunion',
    'Europe/Bucharest',
    'Europe/Belgrade',
    'Europe/Kaliningrad',
    'Europe/Moscow',
    'Europe/Simferopol',
    'Europe/Kirov',
    'Europe/Astrakhan',
    'Europe/Volgograd',
    'Europe/Saratov',
    'Europe/Ulyanovsk',
    'Europe/Samara',
    'Asia/Yekaterinburg',
    'Asia/Omsk',
    'Asia/Novosibirsk',
    'Asia/Barnaul',
    'Asia/Tomsk',
    'Asia/Novokuznetsk',
    'Asia/Krasnoyarsk',
    'Asia/Irkutsk',
    'Asia/Chita',
    'Asia/Yakutsk',
    'Asia/Khandyga',
    'Asia/Vladivostok',
    'Asia/Ust-Nera',
    'Asia/Magadan',
    'Asia/Sakhalin',
    'Asia/Srednekolymsk',
    'Asia/Kamchatka',
    'Asia/Anadyr',
    'Asia/Riyadh',
    'Pacific/Guadalcanal',
    'Indian/Mahe',
    'Africa/Khartoum',
    'Europe/Stockholm',
    'Asia/Singapore',
    'America/Paramaribo',
    'Africa/Juba',
    'Africa/Sao_Tome',
    'America/El_Salvador',
    'Asia/Damascus',
    'America/Grand_Turk',
    'Africa/Ndjamena',
    'Indian/Kerguelen',
    'Asia/Bangkok',
    'Asia/Dushanbe',
    'Pacific/Fakaofo',
    'Asia/Dili',
    'Asia/Ashgabat',
    'Africa/Tunis',
    'Pacific/Tongatapu',
    'Europe/Istanbul',
    'America/Port_of_Spain',
    'Pacific/Funafuti',
    'Asia/Taipei',
    'Europe/Kiev',
    'Europe/Uzhgorod',
    'Europe/Zaporozhye',
    'Pacific/Wake',
    'America/New_York',
    'America/Detroit',
    'America/Kentucky/Louisville',
    'America/Kentucky/Monticello',
    'America/Indiana/Indianapolis',
    'America/Indiana/Vincennes',
    'America/Indiana/Winamac',
    'America/Indiana/Marengo',
    'America/Indiana/Petersburg',
    'America/Indiana/Vevay',
    'America/Chicago',
    'America/Indiana/Tell_City',
    'America/Indiana/Knox',
    'America/Menominee',
    'America/North_Dakota/Center',
    'America/North_Dakota/New_Salem',
    'America/North_Dakota/Beulah',
    'America/Denver',
    'America/Boise',
    'America/Phoenix',
    'America/Los_Angeles',
    'America/Anchorage',
    'America/Juneau',
    'America/Sitka',
    'America/Metlakatla',
    'America/Yakutat',
    'America/Nome',
    'America/Adak',
    'Pacific/Honolulu',
    'America/Montevideo',
    'Asia/Samarkand',
    'Asia/Tashkent',
    'America/Caracas',
    'Asia/Ho_Chi_Minh',
    'Pacific/Efate',
    'Pacific/Wallis',
    'Pacific/Apia',
    'Africa/Johannesburg'
];

8
Bu üstte olmalı
Eugene

Bunun bazı tarayıcılarda çalışmadığını unutmayın. Örneğin. IE11.
Paul LeBeau

IE Konsolu'nda hata: 'timeZone' için 'AMERICA / NEW_YORK' seçenek değeri geçerli aralığın dışında. Beklenen: ['UTC'] @OloghoCyrilPaul
Matee Gojra

1
Çok kolay, çok zarif. Burada tüm zaman dilimlerini içeren bir liste bulabilirsiniz stackoverflow.com/questions/38399465/… . UTC için Londra saat dilimini seçin.
EPurpl3

1
Bu değerlerin hiçbiri "saat dilimi" değildir, aynı tarihi yerel saat dilimine ve gün ışığından yararlanma değişikliklerine sahip yerler için IANA saat dilimi veritabanı temsilcisi konumlarıdır.
RobG

28

Bunun mümkün olduğuna inanmıyorum - oluşturulduktan sonra bir Date nesnesinde saat dilimini ayarlama olanağı yoktur.

Ve bir bakıma bu mantıklı - kavramsal olarak (belki de uygulamada değilse); http://en.wikipedia.org/wiki/Unix_timestamp (vurgu mayını) başına :

Unix zamanı veya POSIX zamanı, 1 Ocak 1970 Perşembe gece yarısı Koordineli Evrensel Zamanından (UTC) bu yana geçen saniye sayısı olarak tanımlanan zamandaki anları tanımlayan bir sistemdir .

Birini inşa ettikten sonra "gerçek" zamanda belirli bir noktayı temsil edecektir. Saat dilimi yalnızca o soyut zaman noktasını insan tarafından okunabilen bir dizeye dönüştürmek istediğinizde geçerlidir.

Bu nedenle, yalnızca Tarihin yapıcıda temsil ettiği gerçek zamanı değiştirebilmeniz mantıklıdır. Ne yazık ki açık bir zaman dilimine geçmenin bir yolu yok gibi görünüyor - ve aradığınız yapıcı (tartışmalı olarak doğru), "yerel" zaman değişkenlerinizi standart olarak sakladığında GMT'ye çeviriyor - bu yüzdenint, int, int için yapıcısı GMT süreleri.

Artı tarafta, bunun yerine bir String alan yapıcıyı kullanmak önemsizdir. Sayısal ayı bir String'e (en azından Firefox'ta) dönüştürmek zorunda değilsiniz, bu yüzden saf bir uygulamanın işe yarayacağını umuyordum. Ancak, denedikten sonra Firefox, Chrome ve Opera'da başarıyla çalışır, ancak Konqueror ("Geçersiz Tarih"), Safari ("Geçersiz Tarih") ve IE'de ("NaN") başarısız olur. Sadece ay gibi bir dizeye dönüştürmek için bir arama dizisi olurdu varsayalım:

var months = [ '', 'January', 'February', ..., 'December'];

function createGMTDate(xiYear, xiMonth, xiDate) {
   return new Date(months[xiMonth] + ' ' + xiDate + ', ' + xiYear + ' 00:00:00 GMT');
}

6
Hiçbir şekilde ne var ki eğer bir tarihi nesne üzerinde saat dilimini ayarlamak için bir yol olduğunu ima ediyorsun, "oluşturulduktan sonra bir Date nesne üzerinde saat dilimi ayarlayın" olarak oluşturulduğu? Bir js tarihi "Çağdan bu yana birkaç saniye civarında ince sarıcı" gibi görünmüyor - sanki saniye sayısı artı bir zaman dilimi gibi görünüyor.
Anthony

1
@Anthony, Sadece müşterinin saat dilimini kullanabilir. Javascript utc ve back için local yapabilir, ancak saat dilimi veritabanına erişim yoktur. Örneğin, San Diego'da olduğunuzda size Mexico City'deki Zamanı söyleyemez.
Samuel Danielson


16

Zaman dilimi de dahil olmak üzere yıl, ay, gün, ... 'den bir Javascript Date nesnesi oluşturma sorunu ile biraz uğraşmak istiyorsanız - yani, bir dizeyi bir Tarihe ayrıştırmak istiyorsanız - o zaman görünüşe göre çileden karmaşık bir dans yapmak zorunda:

// parseISO8601String : string -> Date
// Parse an ISO-8601 date, including possible timezone,
// into a Javascript Date object.
//
// Test strings: parseISO8601String(x).toISOString()
// "2013-01-31T12:34"              -> "2013-01-31T12:34:00.000Z"
// "2013-01-31T12:34:56"           -> "2013-01-31T12:34:56.000Z"
// "2013-01-31T12:34:56.78"        -> "2013-01-31T12:34:56.780Z"
// "2013-01-31T12:34:56.78+0100"   -> "2013-01-31T11:34:56.780Z"
// "2013-01-31T12:34:56.78+0530"   -> "2013-01-31T07:04:56.780Z"
// "2013-01-31T12:34:56.78-0330"   -> "2013-01-31T16:04:56.780Z"
// "2013-01-31T12:34:56-0330"      -> "2013-01-31T16:04:56.000Z"
// "2013-01-31T12:34:56Z"          -> "2013-01-31T12:34:56.000Z"
function parseISO8601String(dateString) {
    var timebits = /^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2})(?::([0-9]*)(\.[0-9]*)?)?(?:([+-])([0-9]{2})([0-9]{2}))?/;
    var m = timebits.exec(dateString);
    var resultDate;
    if (m) {
        var utcdate = Date.UTC(parseInt(m[1]),
                               parseInt(m[2])-1, // months are zero-offset (!)
                               parseInt(m[3]),
                               parseInt(m[4]), parseInt(m[5]), // hh:mm
                               (m[6] && parseInt(m[6]) || 0),  // optional seconds
                               (m[7] && parseFloat(m[7])*1000) || 0); // optional fraction
        // utcdate is milliseconds since the epoch
        if (m[9] && m[10]) {
            var offsetMinutes = parseInt(m[9]) * 60 + parseInt(m[10]);
            utcdate += (m[8] === '+' ? -1 : +1) * offsetMinutes * 60000;
        }
        resultDate = new Date(utcdate);
    } else {
        resultDate = null;
    }
    return resultDate;
}

Yani, saat dilimi olmadan tarihi kullanarak bir 'UTC saati' oluşturursunuz (böylece hangi yerel ayarın olduğunu, yani UTC 'yerel ayarını bilirsiniz ve varsayılan olarak yerel olana ayarlanmazsınız) ve sonra belirtilen saat dilimi farkını manuel olarak uygularsınız.

Birisi gerçekten Javascript tarih nesnesi hakkında daha fazla, oooh, beş dakika düşünmüş olsaydı güzel olmaz mıydı ...


1
büyük işlevi için teşekkürler! değiştireceğim tek şey, saat dilimi dengesindeki iki nokta üst üste desteği eklemektir. var timebits = / ^ ([0-9] {4}) - ([0-9] {2}) - ([0-9] {2}) T ([0-9] {2}) :( [0-9] {2} () :: ([0-9] *?)) (\ [0-9]. *)? (: ([+ -]) ([0-9] { 2} [:]?) ([0-9] {2})) /;
robnardo

2
Bunu düşündüler; ne yazık ki, "onlar" Java dil tasarımcılarıydı, çünkü JS ilk uygulaması için Java'nın Date sınıfını kopyaladı.
Xanthir

@Xanthir Oooh, haklısın ve orijinal Java Date nesnesinin ne kadar korkunç olduğunu unutmuştum; ancak en azından Java bunu reddetti ve devam etti, Javascript'in yapamayacağı bir şey var (tuhaf bir dil, Javascript: oldukça sevimli ve neredeyse ilk göründüğü kadar korkunç değil).
Norman Gray

13
d = new Date();
utc = d.getTime() + (d.getTimezoneOffset() * 60000);
nd = new Date(utc + (3600000*offset));

offset value base on which location time zone you would like to set 
For India offset value +5.5,
New York offset value -4,
London offset value +1

tüm konum ofseti için Wiki UTC zaman ofsetleri listesi


Bu, Yaz Saati uygulaması sırasında New York'a nasıl yardımcı olur?
frederj

New York için lütfen ofset değerini -4 kullanın
Vijay Lathiya

1
New York'un ofseti Yaz Saati uygulamasına göre değişir. Bazen -4 ve bazen -5 en.wikipedia.org/wiki/Eastern_Time_Zone
frederj

8

UTC + z için getTimeZoneOffset eksi.

var d = new Date(xiYear, xiMonth, xiDate);
if(d.getTimezoneOffset() > 0){
    d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );
}

1
Küçük bir hata,! = 0 değil> 0. Ben bunu kullanarak sona erdi
Cristi Bălu Jună

8

Bu, birine yardımcı olabilir, UTC'yi yeni kurucuya ilettiğiniz şeyin sonuna koyabilir

En azından kromda diyebilirsiniz var date = new Date("2014-01-01 11:00:00 UTC")


1
Safari'de "Geçersiz Tarih" i döndürür
pmrotule

1
"UTC" ile değiştirin +0000(00 ile UTC arasındaki boşluğun kaldırılması gerektiğine dikkat edin) ve bu hem Firefox hem de Chrome'da çalışır. Safari'den emin değilim. (Referans: stackoverflow.com/a/17545854/1273587 )
cytsunny

8

Tek hat çözümü

new Date(new Date(1422524805305).getTime() - 330*60*1000)

1422524805305 yerine, zaman damgasını milisaniye cinsinden kullanın 330 yerine saat dilimi uzaklığınızı dakika cinsinden kullanın. GMT (örn. Hindistan +5: 30, 5 * 60 + 30 = 330 dakikadır)


4
Bu, istemcide kod çalışması olacaktır, yani saat dilimi farklı konumdaki kullanıcılarınız için farklı olacaktır. Bu çözüm, ona ihtiyacı olan herkesin aynı saat diliminde (sizin) yaşamasını gerektirecektir.
Kevin Beal

@Kevin Beal bu durumda sadece getTimezoneOffset kullanın
maximus

6
// My clock 2018-07-25, 00:26:00 (GMT+7)
let date = new Date(); // 2018-07-24:17:26:00 (Look like GMT+0)
const myTimeZone = 7; // my timeZone 
// my timeZone = 7h = 7 * 60 * 60 * 1000 (millisecond);
// 2018-07-24:17:26:00 = x (milliseconds)
// finally, time in milliseconds (GMT+7) = x + myTimezone 
date.setTime( date.getTime() + myTimeZone * 60 * 60 * 1000 );
// date.toISOString() = 2018-07-25, 00:26:00 (GMT+7)

Kodunuzu ve sorunun nasıl çözüldüğünü açıklamak cevabınızın kalitesini yükseltir ve kullanıcıların öğrenmesine yardımcı olur.
Nic3500

5

Doğru tarihi bulmanın en kolay yolu datejs kullanmaktır.

http://www.datejs.com/

Tarihlerimi Ajax aracılığıyla şu biçimde bir dize olarak alıyorum: '2016-01-12T00: 00: 00'

var yourDateString = '2016-01-12T00:00:00';
var yourDate = new Date(yourDateString);
console.log(yourDate);
if (yourDate.getTimezoneOffset() > 0){
    yourDate = new Date(yourDateString).addMinutes(yourDate.getTimezoneOffset());
}
console.log(yourDate);

Konsol şunu okuyacaktır:

Pzt 11 Oca 2016 19:00:00 GMT-0500 (Doğu Standart Zamanı)

Sal 12 Oca 2016 00:00:00 GMT-0500 (Doğu Standart Zamanı)

https://jsfiddle.net/vp1ena7b/3/

'AddMinutes' datejs geliyor, muhtemelen kendi başına saf js bunu yapabilirdi, ama zaten projemde datejs vardı, bu yüzden doğru tarihleri ​​almak için kullanmak için bir yol buldum.

Bunun birine yardım edebileceğini düşündüm ...


Tüm yöntemleri denedim ve bu ben sonra ne olduğunu gece yarısı almak için tek oldu!
SharpC

3

herhangi bir kilometre

var d = new Date(xiYear, xiMonth, xiDate).toLocaleString();

Bu benim için hile yapıyor gibi görünüyor (GMT uzak bir saat dilimi), ama "yerel" mutlaka zaman dilimi ile ilgili olmadığı için, ben güvenmezdim.
Mart'ta Wytze

3

Bu kod , tarayıcı saat dilimi ile biçimlendirilmiş Date nesnenizi döndürür .

Date.prototype.timezone = function () {
    this.setHours(this.getHours() + (new Date().getTimezoneOffset() / 60));
    return this;
}

Düzenle:

Tarih API'sini kirletmemek için yukarıdaki işlev bir yardımcı program işlevine dönüştürülebilir. İşlev bir Date nesnesi alır ve mutasyona uğramış bir Date nesnesi döndürür.

function setTimeZone(date) {
    date.setHours(date.getHours() + (new Date().getTimezoneOffset() / 60));
    return date;
}

6
Yerel nesneleri genişletmeye hayır
Paul Rumkin

1

Bundan gördüğüm en iyi çözüm

http://www.codingforums.com/archive/index.php/t-19663.html

Baskı Süresi İşlevi

<script language="javascript" type="text/javascript">
//borrowed from echoecho
//http://www.echoecho.com/ubb/viewthread.php?tid=2362&pid=10482&#pid10482
workDate = new Date()
UTCDate = new Date()
UTCDate.setTime(workDate.getTime()+workDate.getTimezoneOffset()*60000)

function printTime(offset) {
    offset++;
    tempDate = new Date()
    tempDate.setTime(UTCDate.getTime()+3600000*(offset))
    timeValue = ((tempDate.getHours()<10) ? ("0"+tempDate.getHours()) : (""+tempDate.getHours()))
    timeValue += ((tempDate.getMinutes()<10) ? ("0"+tempDate.getMinutes()) : tempDate.getMinutes())
    timeValue += " hrs."
    return timeValue
    }
    var now = new Date()
    var seed = now.getTime() % 0xfffffff
    var same = rand(12)
</script>

Banff, Canada:
<script language="JavaScript">document.write(printTime("-7"))</script>

Tam Kod Örneği

<html>

<head>
<script language="javascript" type="text/javascript">
//borrowed from echoecho
//http://www.echoecho.com/ubb/viewthread.php?tid=2362&pid=10482&#pid10482
workDate = new Date()
UTCDate = new Date()
UTCDate.setTime(workDate.getTime()+workDate.getTimezoneOffset()*60000)

function printTime(offset) {
offset++;
tempDate = new Date()
tempDate.setTime(UTCDate.getTime()+3600000*(offset))
timeValue = ((tempDate.getHours()<10) ? ("0"+tempDate.getHours()) : (""+tempDate.getHours()))
timeValue += ((tempDate.getMinutes()<10) ? ("0"+tempDate.getMinutes()) : tempDate.getMinutes())
timeValue += " hrs."
return timeValue
}
var now = new Date()
var seed = now.getTime() % 0xfffffff
var same = rand(12)
</script>

</head>

<body>
Banff, Canada:
<script language="JavaScript">document.write(printTime("-7"))</script>
<br>
Michigan:
<script language="JavaScript">document.write(printTime("-5"))</script>
<br>
Greenwich, England(UTC):
<script language="JavaScript">document.write(printTime("-0"))</script>
<br>
Tokyo, Japan:
<script language="JavaScript">document.write(printTime("+9"))</script>
<br>
Berlin, Germany:
<script language="JavaScript">document.write(printTime("+1"))</script>

</body>
</html>

Örneğin, Yaz Saati Uygulaması hariçtir. CurrentTime: Cum Oct 04 2013 11:13:43 GMT-0700 (Pasifik Yaz Saati) UttTime: Cum, 04 Eki 2013 18:13:43 GMT Banff, Kanada: 1213 saat. Michigan: 1413 saat. Greenwich, İngiltere (UTC): 1913 saat. Tokyo, Japonya: 0413 saat. Berlin, Almanya: 2013 saat.
Jeson Martajaya

0

iki tarih arasındaki bir zamandaki farkı kontrol etmek istiyorsanız, ikinci saat diliminin ilk istediğiniz saat diliminden daha küçük veya daha büyük olup olmadığını kontrol edebilir ve bir zaman çıkarabilir veya ekleyebilirsiniz.

  const currTimezone = new Date().getTimezoneOffset(); // your timezone
  const newDateTimezone = date.getTimezoneOffset(); // date with unknown timezone

  if (currTimezone !== newDateTimezone) {
    // and below you are checking if difference should be - or +. It depends on if unknown timezone is lesser or greater than yours
    const newTimezone = (currTimezone - newDateTimezone) * (currTimezone > newDateTimezone ? 1 : -1);
    date.setTime(date.getTime() + (newTimezone * 60 * 1000));
  }

0

GMT -03: 00 Örnek

new Date(new Date()-3600*1000*3).toISOString();  // 2020-02-27T15:03:26.261Z

Ya da

now  = new Date().getTime()-3600*1000*3; // 1582818380528
data = new Date(now).toISOString();      // 2020-02-27T15:03:26.261Z

-1

Bu benim için çalıştı. Yine de iyi bir fikir olup olmadığından emin değilim.

var myDate = new Date();
console.log('myDate:', myDate);   // myDate: "2018-04-04T01:09:38.112Z"

var offset = '+5';  // e.g. if the timeZone is -5

var MyDateWithOffset = new Date( myDate.toGMTString() + offset );   

console.log('MyDateWithOffset:', MyDateWithOffset); // myDateWithOffset: "2018-04-03T20:09:38.000Z"


-1

Saat dilimi-js paketini kullandım.

var timezoneJS  = require('timezone-js');
var tzdata = require('tzdata');

createDate(dateObj) {
    if ( dateObj == null ) {
        return null;
    }
    var nativeTimezoneOffset = new Date().getTimezoneOffset();
    var offset = this.getTimeZoneOffset();

    // use the native Date object if the timezone matches
    if ( offset == -1 * nativeTimezoneOffset ) {
        return dateObj;
    }

    this.loadTimeZones();

    // FIXME: it would be better if timezoneJS.Date was an instanceof of Date
    //        tried jquery $.extend
    //        added hack to Fiterpickr to look for Dater.getTime instead of "d instanceof Date"
    return new timezoneJS.Date(dateObj,this.getTimeZoneName());
},

-11

Bu EN İYİ çözümdür

Kullanımı:

// TO ALL dates
Date.timezoneOffset(-240) // +4 UTC

// Override offset only for THIS date
new Date().timezoneOffset(-180) // +3 UTC

Kod:

Date.prototype.timezoneOffset = new Date().getTimezoneOffset();

Date.setTimezoneOffset = function(timezoneOffset) {
  return this.prototype.timezoneOffset = timezoneOffset;
};

Date.getTimezoneOffset = function() {
  return this.prototype.timezoneOffset;
};

Date.prototype.setTimezoneOffset = function(timezoneOffset) {
  return this.timezoneOffset = timezoneOffset;
};

Date.prototype.getTimezoneOffset = function() {
  return this.timezoneOffset;
};

Date.prototype.toString = function() {
  var offsetDate, offsetTime;
  offsetTime = this.timezoneOffset * 60 * 1000;
  offsetDate = new Date(this.getTime() - offsetTime);
  return offsetDate.toUTCString();
};

['Milliseconds', 'Seconds', 'Minutes', 'Hours', 'Date', 'Month', 'FullYear', 'Year', 'Day'].forEach((function(_this) {
  return function(key) {
    Date.prototype["get" + key] = function() {
      var offsetDate, offsetTime;
      offsetTime = this.timezoneOffset * 60 * 1000;
      offsetDate = new Date(this.getTime() - offsetTime);
      return offsetDate["getUTC" + key]();
    };
    return Date.prototype["set" + key] = function(value) {
      var offsetDate, offsetTime, time;
      offsetTime = this.timezoneOffset * 60 * 1000;
      offsetDate = new Date(this.getTime() - offsetTime);
      offsetDate["setUTC" + key](value);
      time = offsetDate.getTime() + offsetTime;
      this.setTime(time);
      return time;
    };
  };
})(this));

Kahve versiyonu:

Date.prototype.timezoneOffset = new Date().getTimezoneOffset()


Date.setTimezoneOffset = (timezoneOffset)->
    return @prototype.timezoneOffset = timezoneOffset


Date.getTimezoneOffset = ->
    return @prototype.timezoneOffset


Date.prototype.setTimezoneOffset = (timezoneOffset)->
    return @timezoneOffset = timezoneOffset


Date.prototype.getTimezoneOffset = ->
    return @timezoneOffset


Date.prototype.toString = ->
    offsetTime = @timezoneOffset * 60 * 1000
    offsetDate = new Date(@getTime() - offsetTime)
    return offsetDate.toUTCString()


[
    'Milliseconds', 'Seconds', 'Minutes', 'Hours',
    'Date', 'Month', 'FullYear', 'Year', 'Day'
]
.forEach (key)=>
    Date.prototype["get#{key}"] = ->
        offsetTime = @timezoneOffset * 60 * 1000
        offsetDate = new Date(@getTime() - offsetTime)
        return offsetDate["getUTC#{key}"]()

    Date.prototype["set#{key}"] = (value)->
        offsetTime = @timezoneOffset * 60 * 1000
        offsetDate = new Date(@getTime() - offsetTime)
        offsetDate["setUTC#{key}"](value)
        time = offsetDate.getTime() + offsetTime
        @setTime(time)
        return time

2
Vay be, ben de sevmiyorum, ama sanırım insanlar gerçekten yerleşiklerin prototipini geçersiz kılmaktan nefret ediyorlar!
Qaribou'dan Josh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.