519 Stimmen

Erzeugen eines Datums mit einer bestimmten Zeitzone ohne Verwendung einer String-Darstellung

Ich habe eine Webseite mit drei Dropdown-Listen für Tag, Monat und Jahr. Wenn ich das JavaScript verwende Date Konstruktor, der Zahlen annimmt, dann erhalte ich eine Date Objekt für meine aktuelle Zeitzone:

new Date(xiYear, xiMonth, xiDate)

Geben Sie das richtige Datum an, aber aufgrund der Sommerzeit wird dieses Datum für GMT+01:00 gehalten.

Das Problem dabei ist, dass ich dann diese Date an eine Ajax-Methode, und wenn das Datum auf dem Server deserialisiert wird, wurde es in GMT umgewandelt und hat dadurch eine Stunde verloren, wodurch sich der Tag um eine Stunde nach hinten verschiebt. Jetzt könnte ich nur den Tag, Monat und Jahr einzeln in die Ajax-Methode übergeben, aber es scheint, dass es einen besseren Weg sein sollte.

Die akzeptierte Antwort wies mich in die richtige Richtung, aber nur mit setUTCHours() von selbst verändert:

Apr 5th 00:00 GMT+01:00 

まで

Apr 4th 23:00 GMT+01:00

Dann musste ich auch noch das UTC-Datum, den Monat und das Jahr einstellen, um am Ende Folgendes zu erhalten

Apr 5th 01:00 GMT+01:00

was ich auch wollte.

22 Stimmen

Wenn die akzeptierte Antwort Sie zwar in die richtige Richtung führt, aber Ihre Frage nicht beantwortet, sollte sie meiner Meinung nach nicht die akzeptierte Antwort sein. Die Antwort sollte die gestellte Frage beantworten.

564voto

jishi Punkte 23417

Mit .setUTCHours() wäre es möglich, Datumsangaben in UTC-Zeit zu machen, was die Verwendung von UTC-Zeiten im gesamten System ermöglichen würde.

Sie können es jedoch nicht mit UTC im Konstruktor festlegen, es sei denn, Sie geben einen Datumsstring an.

Verwendung von new Date(Date.UTC(year, month, day, hour, minute, second)) können Sie ein Datumsobjekt mit einer bestimmten UTC-Zeit erstellen.

119 Stimmen

Mit der Syntax "new Date(Date.UTC(...))" können Sie ein Datum erstellen, das gleichwertig zu einem UTC-Datum in Bezug auf den Zeitpunkt, den es darstellt, aber es ist nicht dasselbe - es hat eine andere (nicht UTC) Zeitzone.

64 Stimmen

Beachten Sie, dass bei der Verwendung von "Date" der "month"-Wert einen Bereich von 0-11 hat (nicht 1-12). Ich erhielt immer einen Zeitzonenversatz von 2h (während es 1h hätte sein sollen) und es dauerte Stunden, bis ich herausfand, dass der Grund dafür ein falscher Monat war.

5 Stimmen

Diese Antwort ist großartig. Aber ich bin mit einer Bibliothek [datepicker ui], die neue Datum an vielen Stellen verwendet. Alles, was ich will, ist die UTC-Zeitzone zu setzen und jedes Datum ist wie pro neue Zeitzone. Ich bin überrascht, dass Javascript nicht nichts für diese haben.

289voto

Matee Gojra Punkte 4048

Einfach die Zeitzone einstellen und zurückkehren Nach

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

Andere Zeitzonen sind wie folgt

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'
];

30 Stimmen

Dies sollte ganz oben stehen

3 Stimmen

Beachten Sie jedoch, dass dies in einigen Browsern nicht funktioniert. Z. B. IE11.

1 Stimmen

Fehler in der IE-Konsole: Der Optionswert 'AMERICA/NEW_YORK' für 'timeZone' liegt außerhalb des gültigen Bereichs. Erwartet: ['UTC'] @OloghoCyrilPaul

231voto

T.W.R. Cole Punkte 3950
var d = new Date(xiYear, xiMonth, xiDate);
d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );

Diese Antwort ist speziell auf die ursprüngliche Frage zugeschnitten und wird nicht unbedingt die Antwort geben, die Sie erwarten. Insbesondere werden einige Leute den Zeitzonen-Offset subtrahieren wollen, anstatt ihn zu addieren. Denken Sie aber daran, dass der ganze Punkt dieser Lösung ist es, Javascript Datum Objekt für eine bestimmte Deserialisierung zu hacken, nicht in allen Fällen korrekt sein.

1 Stimmen

Könnten Sie einfach tun *60000 代わりに *60*1000 :)

64 Stimmen

@gthmb natürlich, aber ich glaube, dass *60*1000 ist in diesem Fall klarer; mit anderen Worten, es ist ziemlich offensichtlich, warum es dort ist.

23 Stimmen

Bei mir funktioniert das fast, aber ich muss - (minus) statt + (plus) verwenden, um die richtige Zeit für meine Zeitzone zu erhalten.

213voto

monsterclub Punkte 1961

Ich glaube, Sie brauchen die createDateAsUTC Funktion (bitte vergleichen Sie mit convertDateToUTC )

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

52 Stimmen

Ich bin erstaunt über seine klare und hilfsbereite Antwort. Ich wusste bis heute nicht, dass die Arbeit mit Javascript-Daten ein solcher Alptraum ist :S

0 Stimmen

Könnten Sie uns den Unterschied zwischen den beiden erklären? Die erste konvertiert date in die UTC-Zeitzone, aber die zweite scheint nichts Sinnvolles zu tun? (gibt dasselbe Datum zurück wie date )

4 Stimmen

Jetzt verstehe ich es: Die erste gibt das Datum in der UTC-Zeitzone zurück, mit den wörtlichen Datumswerten der Ortszeit. Die zweite gibt das Datum in der lokalen Zeitzone zurück, aber mit den wörtlichen Datumswerten in UTC.

28voto

Andrzej Doyle Punkte 99892

Ich glaube nicht, dass dies möglich ist - es gibt keine Möglichkeit, die Zeitzone auf ein Date-Objekt zu setzen, nachdem es erstellt wurde.

Und in gewisser Weise ist dies sinnvoll - konzeptionell (wenn auch vielleicht nicht in der Umsetzung); per http://en.wikipedia.org/wiki/Unix_timestamp (Hervorhebung von mir):

Die Unix-Zeit oder POSIX-Zeit ist ein System zur Beschreibung von Zeitpunkten, definiert als die Anzahl der seit Mitternacht verstrichenen Sekunden Koordinierte Weltzeit (UTC) vom Donnerstag, 1. Januar 1970.

Sobald Sie einen solchen konstruiert haben, wird er einen bestimmten Punkt in "echter" Zeit darstellen. Die Zeitzone ist nur relevant, wenn Sie diesen abstrakten Zeitpunkt in eine für Menschen lesbare Zeichenkette umwandeln wollen.

Daher ist es sinnvoll, dass Sie nur die tatsächliche Zeit, die das Datum darstellt, im Konstruktor ändern können. Leider scheint es keine Möglichkeit zu geben, eine explizite Zeitzone zu übergeben - und der Konstruktor, den Sie (wohl korrekt) aufrufen, übersetzt Ihre "lokalen" Zeitvariablen in GMT, wenn er sie kanonisch speichert - also gibt es keine Möglichkeit, die int, int, int Konstruktor für GMT-Zeiten.

Auf der positiven Seite ist es trivial, einfach den Konstruktor zu verwenden, der stattdessen einen String annimmt. Sie müssen nicht einmal den numerischen Monat in einen String konvertieren (zumindest in Firefox), daher hatte ich gehofft, dass eine naive Implementierung funktionieren würde. Nach dem Ausprobieren funktioniert es jedoch erfolgreich in Firefox, Chrome und Opera, schlägt aber in Konqueror ("Invalid Date"), Safari ("Invalid Date") und IE ("NaN") fehl. Ich nehme an, dass Sie einfach ein Lookup-Array haben, um den Monat in eine Zeichenkette zu konvertieren, etwa so:

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

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

7 Stimmen

Wenn es keine Möglichkeit gibt, "die Zeitzone auf ein Date-Objekt zu setzen, nachdem es erstellt wurde", implizieren Sie, dass es eine Möglichkeit gibt, die Zeitzone auf ein Date-Objekt zu setzen als sie erstellt wird? Es sieht nicht so aus, als wäre ein js-Datum "eine dünne Hülle um eine Anzahl von Sekunden seit der Epoche" - es sieht so aus, als wäre es diese Anzahl von Sekunden, plus eine Zeitzone.

1 Stimmen

@Anthony, Es kann nur die Zeitzone des Kunden verwendet werden. Javascript kann von local zu utc und zurück, aber es hat keinen Zugriff auf eine Zeitzonendatenbank. Es kann Ihnen zum Beispiel nicht die Zeit in Mexico City sagen, wenn Sie in San Diego sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X