我有一个网页,每天,每月和每年有三个下拉菜单.如果我使用Date
带有数字的JavaScript 构造函数,那么我得到一个Date
当前时区的对象:
new Date(xiYear, xiMonth, xiDate)
给出正确的日期,但由于夏令时,它认为日期是GMT + 01:00.
这里的问题是我然后将它传递Date
给Ajax方法,当日期在服务器上反序列化时,它已经转换为GMT,因此丢失了一个小时,将一天移回一.现在我可以将日,月和年单独传递到Ajax方法中,但似乎应该有更好的方法.
接受的答案指出了我正确的方向,但只是单独使用setUTCHours()
改变了:
Apr 5th 00:00 GMT+01:00
至
Apr 4th 23:00 GMT+01:00
然后我还必须设置UTC日期,月份和年份以结束
Apr 5th 01:00 GMT+01:00
这就是我想要的.
使用.setUTCHours()
它可以实际设置UTC时间的日期,这将允许您在整个系统中使用UTC时间.
但是,除非指定日期字符串,否则不能在构造函数中使用UTC设置它.
使用new Date(Date.UTC(year, month, day, hour, minute, second))
您可以从特定的UTC时间创建日期对象.
var d = new Date(xiYear, xiMonth, xiDate); d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );
这个答案专门针对原始问题量身定制,并且不会给出您一定期望的答案.特别是,有些人会想要减去时区偏移而不是添加它.请记住,这个解决方案的重点是破解javascript的日期对象以进行特定的反序列化,而不是在所有情况下都是正确的.
我相信你需要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()); }
只需设置时区并取回
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' ];
我不相信这是可能的 - 在创建Date对象后无法设置时区.
在某种程度上,这是有道理的 - 从概念上讲(如果不是在实施中); 根据http://en.wikipedia.org/wiki/Unix_timestamp(强调我的):
Unix时间或POSIX时间是用于描述时间瞬间的系统,定义为自1970年1月1日星期四午夜协调世界时(UTC)以来经过的秒数.
一旦你构建了它,它将代表"真实"时间中的某个点.只有当您想将该抽象时间点转换为人类可读的字符串时,时区才有意义.
因此,有意义的是,您只能更改Date在构造函数中表示的实际时间.可悲的是,似乎没有办法传递一个明确的时区 - 你正在调用的构造函数(可以说是正确的)将你的"本地"时间变量转换为GMT,当它以规范方式存储它们时 - 所以没有办法使用int, int, int
构造函数GMT时代.
从好的方面来说,只使用带有String的构造函数是微不足道的.你甚至不必将数字月转换为字符串(至少在Firefox上),所以我希望一个天真的实现可以工作.但是,在尝试之后,它在Firefox,Chrome和Opera中成功运行,但在Konqueror("无效日期"),Safari("无效日期")和IE("NaN")中失败.我想你只需要一个查找数组来将月份转换为字符串,如下所示:
var months = [ '', 'January', 'February', ..., 'December']; function createGMTDate(xiYear, xiMonth, xiDate) { return new Date(months[xiMonth] + ' ' + xiDate + ', ' + xiYear + ' 00:00:00 GMT'); }
我知道这是旧的,但如果它有帮助你可以使用时刻和时刻.如果你还没有看到他们看看.
http://momentjs.com/timezone/
http://momentjs.com/
两个非常方便的时间操作库.
如果你想处理从年,月,日,...,包括时区创建Javascript Date对象的稍微不同但相关的问题- 也就是说,如果你想将字符串解析为Date - 那么你显然必须做一个令人愤怒的复杂舞蹈:
// 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'区域设置',并且它不默认为本地区域),然后手动应用指示的时区偏移.
如果有人真的想过 Javascript日期对象超过,噢,五分钟,那会不会很好....
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
对于所有位置偏移Wiki时间偏移列表
对于UTC + z,getTimeZoneOffset为负数.
var d = new Date(xiYear, xiMonth, xiDate); if(d.getTimezoneOffset() > 0){ d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 ); }
这可以帮助某人,将UTC放在传递给新构造函数的末尾
你可以说至少在chrome中 var date = new Date("2014-01-01 11:00:00 UTC")
一线解决方案
new Date(new Date(1422524805305).getTime() - 330*60*1000)
而不是1422524805305,使用时间戳(以毫秒为单位)而不是330,使用您的时区偏移量(以分钟为单位).GMT(例如印度+5:30是5*60 + 30 = 330分钟)
// 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)
我发现获得正确日期的最简单方法是使用datejs.
http://www.datejs.com/
我通过Ajax以这种格式将日期作为字符串:'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);
控制台将显示:
2016年1月11日星期一19:00:00 GMT-0500(东部标准时间)
2016年1月12日星期二00:00:00 GMT-0500(东部标准时间)
https://jsfiddle.net/vp1ena7b/3/
'addMinutes'来自datejs,您可以自己在纯js中执行此操作,但我已经在项目中使用了datejs,因此我找到了一种方法来使用它来获取正确的日期.
我以为这可能对某人有帮助......