एक स्ट्रिंग प्रतिनिधित्व का उपयोग किए बिना एक सेट टाइमज़ोन के साथ एक तिथि बनाएँ


412

मेरे पास दिन, महीने और वर्ष के लिए तीन ड्रॉपडाउन के साथ एक वेब पेज है। अगर मैं जावास्क्रिप्ट Dateकंस्ट्रक्टर का उपयोग करता हूं जो संख्या लेता है, तो मुझे Dateअपने वर्तमान समय क्षेत्र के लिए एक वस्तु मिलती है :

new Date(xiYear, xiMonth, xiDate)

सही तारीख दें, लेकिन यह सोचता है कि दिन की बचत समय के कारण तारीख GMT + 01: 00 है।

यहाँ समस्या यह है कि मैं फिर इसे Dateएक अजाक्स विधि से पारित करता हूं और जब तारीख सर्वर पर डिसेर्बलाइज हो जाती है तो इसे GMT में बदल दिया जाता है और इसलिए एक घंटे में खो जाता है जो एक दिन पीछे चला जाता है। अब मैं केवल दिन, महीने और वर्ष को व्यक्तिगत रूप से अजाक्स विधि में पारित कर सकता हूं, लेकिन ऐसा लगता है कि एक बेहतर तरीका होना चाहिए।

स्वीकार किए गए उत्तर ने मुझे सही दिशा में इंगित किया, हालांकि केवल setUTCHours()स्वयं द्वारा उपयोग किए गए परिवर्तन:

Apr 5th 00:00 GMT+01:00 

सेवा

Apr 4th 23:00 GMT+01:00

मुझे तब यूटीसी की तारीख, महीना और साल भी खत्म करना था

Apr 5th 01:00 GMT+01:00

जो मैं चाहता था।


9
यदि स्वीकृत उत्तर आपको सही दिशा में इंगित करता है, लेकिन आपके प्रश्न का उत्तर नहीं दिया है, तो मेरा तर्क है कि यह स्वीकृत उत्तर नहीं होना चाहिए। पूछे गए प्रश्न का उत्तर देना चाहिए।
TWR कोल

जवाबों:


481

.setUTCHours()इसका उपयोग करना वास्तव में UTC- समय में दिनांक सेट करना संभव होगा, जो आपको पूरे सिस्टम में UTC-time का उपयोग करने की अनुमति देगा।

जब तक आप दिनांक-स्ट्रिंग निर्दिष्ट नहीं करते, तब तक आप इसे कंस्ट्रक्टर में UTC का उपयोग करके सेट नहीं कर सकते।

उपयोग करके new Date(Date.UTC(year, month, day, hour, minute, second))आप एक विशिष्ट UTC समय से दिनांक-ऑब्जेक्ट बना सकते हैं।


101
"नई तिथि (Date.UTC (...))" सिंटैक्स आपको उस दिनांक को बनाने की अनुमति देता है जो उस समय के संदर्भ में एक UTC दिनांक के बराबर है जो इसे प्रस्तुत करता है, लेकिन यह समान नहीं है - इसमें एक अलग (गैर यूटीसी) समय क्षेत्र।
एंथनी

52
ध्यान रखें कि "तिथि" का उपयोग करते समय "महीने" -value की सीमा 0-11 (1-12 नहीं) है। मैं 2h का टाइमज़ोन-ऑफ़ प्राप्त करता रहा (जबकि यह 1h होना चाहिए था) और मुझे यह पता लगाने में घंटों लग गए कि कारण एक गलत महीना था।
Select0r

4
यह उत्तर बहुत अच्छा है। लेकिन मैं एक पुस्तकालय [डेटपिकर यूई] का उपयोग कर रहा हूं जो कई स्थानों पर नई तिथि का उपयोग कर रहा है। मैं बस यही चाहता हूं कि यूटीसी टाइमज़ोन सेट किया जाए और हर तारीख नए टाइमज़ोन के अनुसार हो। मुझे आश्चर्य है कि जावास्क्रिप्ट के पास इसके लिए कुछ भी नहीं है।
संजीव कुमार दांगी

6
@ jishi- दिनांक ऑब्जेक्ट UTC समय मान पर आधारित होते हैं, स्थानीय समय पर नहीं। हालाँकि, डिफ़ॉल्ट Date.prototype.toString विधि स्थानीय समय मान प्रदर्शित करेगी ।
रॉबजी

5
@ एंथोनी- " लेकिन यह एक ही समय नहीं है" सही नहीं है। यह समय में बिल्कुल उसी क्षण का प्रतिनिधित्व करता है, एकमात्र अंतर टाइमजोन ऑफसेट है।
रॉब

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

यह उत्तर विशेष रूप से मूल प्रश्न के अनुरूप है, और वह उत्तर नहीं देगा जो आप आवश्यक रूप से अपेक्षा करते हैं। विशेष रूप से, कुछ लोग इसे जोड़ने के बजाय टाइमज़ोन ऑफसेट को घटाना चाहेंगे। हालांकि याद रखें कि इस समाधान का पूरा बिंदु किसी विशेष deserialization के लिए जावास्क्रिप्ट की दिनांक ऑब्जेक्ट को हैक करना है, सभी मामलों में सही नहीं होना है।


62
@ निश्चित रूप से, लेकिन मुझे लगता है कि *60*1000इस मामले में स्पष्ट है; दूसरे शब्दों में, यह काफी स्पष्ट है कि यह क्यों है।
TWR कोल

22
यह मेरे लिए लगभग काम करता है, सिवाय इसके कि मुझे अपने समय क्षेत्र के लिए सही समय प्राप्त करने के लिए + (प्लस) के बजाय - (घटा) का उपयोग करना होगा।
Wytze

3
हाँ, जैसा कि अन्य ने बताया है - मुझे लगता है कि इस उत्तर में गलती है। शून्य से अधिक नहीं होना चाहिए।
UpTheCreek

3
के अनुसार developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... getTimezoneOffset द्वारा दिए गए मान वास्तविक समय आप खाते में डीएसटी लेने सहित समारोह, फोन आपके स्थान में ऑफसेट के अनुसार हस्ताक्षरित किया गया है, इसलिए मुझे समझ नहीं आ रहा है कि आपको इसे घटाना क्यों पड़ेगा।
TWR कोल

15
यदि आप टाइमज़ोनऑफ़सेट को दिनांक ऑब्जेक्ट में जोड़ते हैं, तो स्थानीय टाइमज़ोन में स्वरूपित इसका मान UTC में सही मान की तरह दिखेगा, लेकिन इसमें अभी भी मूल टाइमज़ोन ऑफ़सेट (और "ISOString" जैसे कुछ अभ्यावेदन वास्तव में दिखाई देंगे)। तो इस बात पर निर्भर करता है कि आप फिर दिनांक ऑब्जेक्ट को कैसे क्रमबद्ध करते हैं, JS आपको गलत उत्तर देते हुए फिर से समय-सीमा ऑफसेट लागू कर सकता है । मेरा मानना ​​है कि यह +/- के बीच इन टिप्पणियों में भ्रम के लिए जिम्मेदार है। वैसे भी, मेरा पतन इस तथ्य के लिए है और "उन अधिकांश मामलों के लिए जो आपको उम्मीद है कि आपको मिलेंगे"।
मेटमैट

173

मेरा मानना ​​है कि आपको createDateAsUTC फ़ंक्शन की आवश्यकता है (कृपया 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()); 
}

36
मैं उनकी उत्तर स्पष्टता और सहायकता के बारे में चकित हूं। यह नहीं पता था कि जावास्क्रिप्ट तारीखों के साथ काम करना आज तक एक बुरा सपना था: S
will824

दोनों के बीच अंतर बताते हुए मन? पहला dateयूटीसी टाइमजोन में परिवर्तित हो जाता है, लेकिन दूसरा कुछ भी उपयोगी नहीं लगता है? (के रूप में एक ही तारीख date)
जोनाथन लिन

4
मुझे अब यह मिल गया है: पहला यूटीसी टाइमज़ोन में स्थानीय समय के शाब्दिक तारीख मूल्यों के साथ तारीख देता है। दूसरा स्थानीय समय-क्षेत्र में तारीख देता है, लेकिन UTC शाब्दिक तिथि मानों के साथ।
जोनाथन लिन

8
यह दृष्टिकोण "एपोच शिफ्टिंग" नामक एक पैटर्न का एक कार्यान्वयन है, जिसका उद्देश्य वर्तमान समय क्षेत्र ऑफसेट द्वारा स्थानांतरित किए गए एक के लिए युग (जो यूटीसी आधारित है) को स्थानांतरित करना है। दुर्भाग्य से, हालांकि यह आमतौर पर देखा जाता है, यह दृष्टिकोण त्रुटिपूर्ण है। जावास्क्रिप्ट का Dateउद्देश्य हमेशा यूटीसी-आधारित यूनिक्स युग और स्थानीय समय क्षेत्र को प्रतिबिंबित करेगा । जब आप toStringपरिणामी दिनांक ऑब्जेक्ट पर कॉल करते हैं और तब भी स्थानीय समय क्षेत्र देखते हैं, तब भी यह लक्षण स्पष्ट है , भले ही आपको यह UTC में होने की उम्मीद हो।
मैट जॉनसन-पिंट

2
यह स्थानीय समय क्षेत्र के दिन के समय की बचत के निकट समय मानों में त्रुटियों का कारण बन सकता है। संक्षेप में, युगीन स्थानांतरण (किसी भी कार्यान्वयन के माध्यम से) जावास्क्रिप्ट Dateऑब्जेक्ट के साथ काम नहीं करता है । इसे देखने का एक अन्य तरीका यह है कि Date.UTCयूटीसी-आधारित मूल्यों की अपेक्षा है, और आप इसे स्थानीय समय मानों और Dateनिर्माता के साथ विसे-वर्सा खिला रहे हैं ।
मैट जॉनसन-पिंट

70

बस समय क्षेत्र निर्धारित करें और उसके अनुसार वापस जाएं

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

अन्य समय-क्षेत्र निम्नलिखित हैं

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
यह शीर्ष पर रास्ता होना चाहिए
यूजीन

सिवाय इसके कि कुछ ब्राउज़रों में यह काम नहीं करता है जागरूक रहें। उदाहरण के लिए। IE11।
पॉल लेबेउ

IE कंसोल में त्रुटि: विकल्प मान 'AMERICA / NEW_YORK' के लिए 'timeZone' मान्य श्रेणी से बाहर है। अपेक्षित: [ 'यूटीसी'] @OloghoCyrilPaul
Matee गोजरा

1
बहुत आसान, बहुत सुरुचिपूर्ण। आप यहां सभी टाइमज़ोन स्टैकओवरफ्लो के साथ एक सूची पा सकते हैं ।.com/questions/ 38399465/… । UTC के लिए लंदन समयक्षेत्र चुनें।
EPurpl3

1
उन मूल्यों में से कोई भी "टाइमज़ोन" नहीं हैं, वे उन स्थानों के लिए IANA टाइमज़ोन डेटाबेस प्रतिनिधि स्थान हैं जिनके पास एक ही ऐतिहासिक स्थानीय समयक्षेत्र और दिन के उजाले की बचत परिवर्तन हैं।
रोबग

28

मुझे विश्वास नहीं है कि यह संभव है - डेट ऑब्जेक्ट को बनाने के बाद टाइमज़ोन सेट करने की कोई क्षमता नहीं है।

और एक तरह से यह समझ में आता है - वैचारिक रूप से (यदि शायद कार्यान्वयन में नहीं); प्रति http://en.wikipedia.org/wiki/Unix_timestamp (जोर मेरा):

यूनिक्स समय, या पोसिक्स समय, समय में इंस्टेंट का वर्णन करने के लिए एक प्रणाली है, जिसे 1 जनवरी, 1970 के मध्यरात्रि समन्वित यूनिवर्सल टाइम (यूटीसी) के बाद से सेकंड की संख्या के रूप में परिभाषित किया गया है ।

एक बार निर्माण करने के बाद यह "वास्तविक" समय में एक निश्चित बिंदु का प्रतिनिधित्व करेगा। समय क्षेत्र केवल तब प्रासंगिक होता है जब आप उस अमूर्त समय बिंदु को मानव-पठनीय स्ट्रिंग में बदलना चाहते हैं।

इस प्रकार यह समझ में आता है कि आप केवल वास्तविक समय को बदल सकते हैं, जब दिनांक निर्माणकर्ता का प्रतिनिधित्व करता है। अफसोस की बात है कि यह स्पष्ट समय-क्षेत्र में पारित करने का कोई तरीका नहीं है - और जिस रचनाकार को आप बुला रहे हैं (यकीनन सही ढंग से) अपने "स्थानीय" समय चर को GMT में तब परिवर्तित करता है जब वह उन्हें स्टोर करता int, int, intहै। GMT बार।

प्लस साइड पर, यह केवल कंस्ट्रक्टर का उपयोग करने के लिए तुच्छ है जो इसके बजाय स्ट्रिंग लेता है। आपको सांख्यिक महीने को स्ट्रिंग (कम से कम फ़ायरफ़ॉक्स पर) में परिवर्तित करने की आवश्यकता नहीं है, इसलिए मुझे उम्मीद थी कि एक भोली कार्यान्वयन काम करेगा। हालाँकि, इसे आज़माने के बाद यह फ़ायरफ़ॉक्स, क्रोम और ओपेरा में सफलतापूर्वक काम करता है लेकिन कोनकोर ("अमान्य दिनांक"), सफारी ("अमान्य दिनांक") और IE ("NaN") में विफल रहता है। मुझे लगता है कि आपके पास महीने को स्ट्रिंग में बदलने के लिए एक लुकअप सरणी होगी, जैसे:

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

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

6
यदि "बनाने के बाद दिनांक ऑब्जेक्ट पर टाइमज़ोन सेट करने का कोई तरीका नहीं है", तो क्या आप इसका अर्थ यह लगा रहे हैं कि डेट ऑब्जेक्ट पर टाइमज़ोन सेट करने का कोई तरीका है जैसा कि इसे बनाया जाता है? ऐसा नहीं लगता है कि एक js तारीख "सेकंड के बाद से कई सेकंड के आसपास पतली आवरण" है - ऐसा लगता है कि यह सेकंड की गिनती है, साथ ही एक समय क्षेत्र भी है।
एंथनी

1
@ एंथनी, यह केवल ग्राहक के समयक्षेत्र का उपयोग कर सकता है। जावास्क्रिप्ट का उपयोग करने के लिए स्थानीय और वापस कर सकते हैं, लेकिन एक समय क्षेत्र डेटाबेस तक पहुँच नहीं है। उदाहरण के लिए, मेक्सिको सिटी में आप सैन डिएगो में होने पर इसका समय नहीं बता सकते।
सैमुअल डेनियलसन

20

मुझे पता है कि यह पुराना है लेकिन अगर यह आपकी मदद करता है तो आप पल-पल समय क्षेत्र का उपयोग कर सकते हैं। यदि आपने उन्हें नहीं देखा है तो देख लें।

http://momentjs.com/timezone/

http://momentjs.com/

दो वास्तव में आसान समय हेरफेर पुस्तकालयों।


16

यदि आप वर्ष, माह, दिन, ..., सहित कुछ अलग, लेकिन संबंधित, एक जावास्क्रिप्ट तिथि ऑब्जेक्ट बनाने की समस्या से निपटना चाहते हैं , तो टाइमज़ोन सहित - यदि आप एक तार को डेट में पार्स करना चाहते हैं - तो आप जाहिरा तौर पर एक जटिल जटिल नृत्य करना है:

// 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;
}

यही है, आप बिना टाइमज़ोन के तारीख का उपयोग करके एक 'UTC समय' बनाते हैं (इसलिए आप जानते हैं कि यह किस लोकेल में है, अर्थात् UTC 'लोकेल', और यह स्थानीय एक के लिए डिफ़ॉल्ट नहीं है), और फिर मैन्युअल रूप से संकेत किए गए टाइमज़ोन ऑफ़सेट लागू करें।

क्या यह अच्छा नहीं होता अगर किसी ने वास्तव में जावास्क्रिप्ट तारीख वस्तु के बारे में अधिक से अधिक, ऊह, पांच मिनट के बारे में सोचा था ...।


1
शानदार समारोह के लिए धन्यवाद! केवल एक चीज जो मैं बदलूंगा वह है समय-क्षेत्र की ऑफसेट में कोलन के लिए समर्थन जोड़ना। 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})) /;
लुटनार्डो

2
उन्होंने इसके बारे में सोचा था; दुर्भाग्य से, "वे" जावा भाषा के डिजाइनर थे, क्योंकि जेएस ने अपने प्रारंभिक कार्यान्वयन के लिए सिर्फ जावा की तिथि वर्ग की नकल की थी।
Xanthir

@Xanthir Oooh, आप सही हैं, और मैं भूल गया था कि मूल जावा दिनांक ऑब्जेक्ट कितना भयानक था; लेकिन कम से कम जावा ने इसे हटा दिया और आगे बढ़ गया, कुछ जावास्क्रिप्ट ऐसा करने में असमर्थ प्रतीत होता है (यह एक विचित्र भाषा है, जावास्क्रिप्ट: बल्कि प्यारा, और लगभग उतना भयानक नहीं जितना कि यह पहली बार प्रतीत होता है)।
नॉर्मन ग्रे

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

UTC समय ऑफसेट के सभी स्थान ऑफसेट विकी सूची के लिए


डेलाइट सेविंग टाइम के दौरान न्यूयॉर्क के लिए यह कैसे मदद करता है?
19

न्यूयॉर्क के लिए कृपया ऑफसेट वैल्यू -4 का उपयोग करें
विजय लठिया

1
न्यूयॉर्क के लिए ऑफसेट डेलाइट बचत समय के अनुसार बदलता रहता है। कभी-कभी यह -4 होता है और कभी-कभी यह -5 होता है। en.wikipedia.org/wiki/Eastern_Time_Zone
frederj

8

getTimeZoneOffset UTC + z के लिए ऋण है।

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

1
थोड़ी सी गलती,! = 0 नहीं> 0. मैंने इसका उपयोग करना समाप्त कर दिया
Cristi Bălu Jună

8

यह किसी की मदद कर सकता है, नए निर्माणकर्ता के पास जो आप पास करते हैं, उसके अंत में यूटीसी डालें

कम से कम क्रोम में आप कह सकते हैं var date = new Date("2014-01-01 11:00:00 UTC")


1
सफारी पर "अमान्य दिनांक" लौटाता है
शत्रुघ्न

1
`UTC` को बदलें +0000(ध्यान दें कि 00 और UTC के बीच के स्थान को हटाने की आवश्यकता है) और यह फ़ायरफ़ॉक्स और क्रोम दोनों पर काम करेगा। हालांकि सफारी के लिए निश्चित नहीं है। (संदर्भ: stackoverflow.com/a/17545854/1273587 )
साइबरसनी

8

एक लाइन समाधान

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

1422524805305 के बजाय, मिलीसेकंड में टाइमस्टैम्प का उपयोग करें 330 के बजाय, अपने टाइमज़ोन ऑफ़सेट का उपयोग मिनट बीटी में करें। GMT (जैसे भारत +5: 30 5 * 60 + 30 = 330 मिनट)


4
यह क्लाइंट पर कोड रन होगा, जिसका अर्थ है कि आपके अलग-अलग स्थित उपयोगकर्ताओं के लिए टाइमज़ोन अलग-अलग होगा। इस समाधान के लिए आवश्यक है कि हर कोई जो एक ही समयक्षेत्र (आपका) में रहता है।
केविन बील

उस मामले में @ केविन बील सिर्फ गेटटाइमज़ोनऑफसेट का उपयोग करें
अधिकतम

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)

आपके कोड की व्याख्या करना और यह समस्या को कैसे हल करता है, आपके उत्तर की गुणवत्ता को बढ़ाएगा, और उपयोगकर्ताओं को सीखने में मदद करेगा।
निक 3500

5

सबसे आसान तरीका जो मैंने सही तारीख पाने के लिए पाया है वह खजूर का उपयोग कर रहा है।

http://www.datejs.com/

मुझे इस प्रारूप में अजाक्स के माध्यम से अपनी तारीखें एक स्ट्रिंग के रूप में प्राप्त होती हैं: '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);

कंसोल पढ़ेंगे:

सोम जनवरी 11 2016 19:00:00 GMT-0500 (पूर्वी मानक समय)

मंगल जनवरी 12 2016 00:00:00 GMT-0500 (पूर्वी मानक समय)

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

'AddMinutes' datejs से आता है, आप शायद अपने दम पर शुद्ध js में ऐसा कर सकते हैं, लेकिन मेरे पास पहले से ही अपने प्रोजेक्ट में datejs थे इसलिए मुझे सही तिथियों को प्राप्त करने के लिए इसका उपयोग करने का एक तरीका मिला।

मैंने सोचा कि यह किसी की मदद कर सकता है ...


सभी तरीकों की कोशिश की और आधी रात को पाने के लिए केवल यही एक था जो मैं था!
शार्प

3

में किसी भी लाभ

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

यह मेरे लिए चाल (GMT से एक समय क्षेत्र) दूर करने के लिए लगता है, लेकिन चूंकि "लोकेल" आवश्यक रूप से टाइमज़ोन से संबंधित नहीं है, इसलिए मैं इस पर भरोसा नहीं करूंगा।
Wytze

3

यह कोड ब्राउज़र टाइमज़ोन के साथ स्वरूपित आपकी दिनांक ऑब्जेक्ट को लौटा देगा ।

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

संपादित करें:

दिनांक API को प्रदूषित करने से बचने के लिए, उपरोक्त फ़ंक्शन को एक उपयोगिता फ़ंक्शन में परिवर्तित किया जा सकता है। फ़ंक्शन एक दिनांक ऑब्जेक्ट लेता है, और एक उत्परिवर्तित दिनांक ऑब्जेक्ट देता है।

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

6
देशी वस्तुओं का विस्तार करने के लिए नहीं
पॉल रुमकिन

1

बेस्ट सॉल्यूशन मैंने इसी से देखा है

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

प्रिंट समय समारोह

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

पूर्ण कोड उदाहरण

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

आपका उदाहरण डेलाइट सेविंग टाइम को बाहर करता है। करंट टाइम: शुक्र अक्टूबर 04 2013 11:13:43 GMT-0700 (प्रशांत डेलाइट टाइम) UtcTime: शुक्र, 04 अक्टूबर 2013 18:13:43 GMT बैनफ, कनाडा: 1213 बजे। मिशिगन: 1413 बजे। ग्रीनविच, इंग्लैंड (UTC): 1913 बजे। टोक्यो, जापान: 0413 बजे। बर्लिन, जर्मनी: 2013 बजे।
जेसन मार्तजया

0

यदि आप दो तिथियों के बीच के समय में अंतर की जांच करना चाहते हैं, तो आप बस यह देख सकते हैं कि क्या दूसरा टाइमज़ोन आपके पहले वांछित टाइमज़ोन से कम या अधिक है और एक समय घटाएं या जोड़ें।

  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 उदाहरण

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

या और भी

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

-1

इसने मेरे लिए काम किया। यकीन नहीं होता कि यह एक अच्छा विचार है।

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

मैंने टाइमजोन-जेएस पैकेज का इस्तेमाल किया।

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

यह BEST समाधान है

का उपयोग करते हुए:

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

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

कोड:

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

कॉफी संस्करण:

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
वाह, मुझे यह पसंद नहीं है, लेकिन मुझे लगता है कि लोग वास्तव में आपको बिल्डिंग्स के प्रोटोटाइप से नफरत करते हैं!
Qaribou
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.