时区计算,冬夏令时, 计算历史某一刻的某地区的时区
首先来聊聊冬夏令时
冬令时和夏令时是为了节约能源和充分利用光照资源而设立的时间制度。在夏季,许多国家和地区会将时钟拨快一小时,称为夏令时,以便让人们早起早睡,减少照明用电。而在冬季,时钟会拨回标准时间,称为冬令时。
历史背景和实施国家
夏令时的概念最早由新西兰昆虫学家George Vernon Hudson在1895年提出,但未得到广泛响应。1907年,英国建筑师威廉·维莱特向英国议会提出了夏令时的构思,但未被采纳。德国于1916年首次正式使用夏令时,随后英国、法国和俄罗斯也开始执行。目前,全世界有近110个国家每年实行夏令时。
中国的实施情况
中国在1986年至1991年间曾实行夏令时制度。具体做法是每年从4月中旬的第一个星期日起将时钟拨快一小时,称为夏令时开始;到9月中旬的第一个星期日再拨回一小时,称为夏令时结束。然而,自1992年起,中国暂停实行夏令时
java 中获取时区的方式
1.指定时区,这种就会忽略夏令时 因为指定了 -4
TimeZone tz = TimeZone.getTimeZone("GMT-04:00");
2.指定地点城市zoneId,会自动计算夏令时
TimeZone tz = TimeZone.getTimeZone("America/New_York");
以new york为例
2024年 11 月 3 号调整了冬令时, 时区由-4 调整为 -5
参考网站:
我们来实际计算下 纽约 在2024-11-02 13:00:00这个时刻的当时时间下的时区是夏令时还是冬令时
public static void main(String[] args) throws ParseException {
//1指定时区为纽约
ZoneId newYorkZoneId = ZoneId.of("America/New_York");
TimeZone tz = TimeZone.getTimeZone(newYorkZoneId);
//初始化一个时间格式化,并指定纽约时区
FastDateFormat format = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss", tz);
//使用纽约时区,反序列化一个时间
Date date = format.parse("2024-11-02 13:00:00");
//获取时区
ZonedDateTime pastTimeInNewYork = ZonedDateTime.ofInstant(date.toInstant(), newYorkZoneId);
System.out.println("过去时间点的时区信息: " + pastTimeInNewYork.getOffset());
}
上面结果输出为
可以看到,2024-11-02时间点的纽约时区信息: -04:00
当我们将历史时间 修改为 11月3号,
可以看到这里同样是纽约, 11月3号的时区已经变为-5, 因为调整了冬令时
夏令时和冬令时调整的时间是不固定的, 例如纽约冬令时开始时间是每年11月的第一个星期日, 2024年就是 11月3号, 具体时间为2点调整为1点
如果遇到闰年冬令时会推迟一天
闰年是为了弥补因人为历法规定的年度天数365日和地球实际公转周期(大约365.24219日)的时间差而设立的。具体来说,闰年的规则如下:
能被4整除的年份通常是闰年,这意味着每四年,我们会增加一天,即2月29日,使得该年有366天。
经过上面的内容我们可以得到结论
这样得到某个城市,某个时刻的 具体时区,这样就可以 准确的进行时间转换
拓展:
介绍下时间转换方法
/**
* 将sourceDate转换成指定时区的时间
*
* @param sourceDate
* @param sourceTimezone sourceDate所在的时区
* @param targetTimezone 转化成目标时间所在的时区
* @return
*/
public static Date convertTimezone(Date sourceDate, TimeZone sourceTimezone, TimeZone targetTimezone) {
Calendar calendar = Calendar.getInstance();
//原时间
long sourceTime = sourceDate.getTime();
calendar.setTimeZone(sourceTimezone);
calendar.setTimeInMillis(sourceTime);
//获取源时区的到UTC的时区差
int sourceZoneOffset = calendar.get(Calendar.ZONE_OFFSET);
//目标时区
calendar.setTimeZone(targetTimezone);
calendar.setTimeInMillis(sourceTime);
//获取目标时区的到UTC的时区差
int targetZoneOffset = calendar.get(Calendar.ZONE_OFFSET);
long targetTime = sourceTime + targetZoneOffset - sourceZoneOffset;
return new Date(targetTime);
}
请注意,如果想考虑冬夏令时,上面的targetTimezonetimeZone一定要是 根据城市获取的,而不是固定偏移量的
TimeZone.getTimeZone("America/New_York")
时区ID枚举
世界城市zoneID枚举,点我, 点我,点我!
zoneID
Asia/Harbin
Asia/Shanghai
Asia/Chungking
Asia/Urumqi
Asia/Kashgar
Asia/Hong_Kong
Asia/Macao
Asia/Taipei
Asia/Dubai
Asia/Kabul
Asia/Yerevan
Asia/Baku
Asia/Dacca
Asia/Bahrain
Asia/Brunei
Asia/Thimphu
Asia/Nicosia
Asia/Tbilisi
Asia/Jakarta
Asia/Ujung_Pandang
Asia/Jayapura
Asia/Jerusalem
Asia/Calcutta
Asia/Baghdad
Asia/Tehran
Asia/Amman
Asia/Tokyo
Asia/Bishkek
Asia/Phnom_Penh
Asia/Pyongyang
Asia/Seoul
Asia/Kuwait
Asia/Almaty
Asia/Aqtobe
Asia/Aqtau
Asia/Vientiane
Asia/Beirut
Asia/Colombo
Asia/Rangoon
Asia/Ulaanbaatar
Asia/Hovd
Asia/Kuala_Lumpur
Asia/Kuching
Asia/Katmandu
Asia/Muscat
Asia/Manila
Asia/Karachi
Asia/Gaza
Asia/Qatar
Asia/Yekaterinburg
Asia/Omsk
Asia/Novosibirsk
Asia/Krasnoyarsk
Asia/Irkutsk
Asia/Yakutsk
Asia/Vladivostok
Asia/Magadan
Asia/Kamchatka
Asia/Anadyr
Asia/Riyadh
Asia/Singapore
Asia/Damascus
Asia/Bangkok
Asia/Dushanbe
Asia/Ashgabat
Asia/Dili
Asia/Samarkand
Asia/Tashkent
Asia/Saigon
Asia/Aden
America/Antigua
America/Anguilla
America/Curacao
America/Buenos_Aires
America/Rosario
America/Cordoba
America/Jujuy
America/Catamarca
America/Mendoza
America/Aruba
America/Barbados
America/La_Paz
America/Noronha
America/Belem
America/Fortaleza
America/Araguaina
America/Maceio
America/Sao_Paulo
America/Cuiaba
America/Porto_Velho
America/Boa_Vista
America/Manaus
America/Porto_Acre
America/Nassau
America/Belize
America/St_Johns
America/Halifax
America/Glace_Bay
America/Goose_Bay
America/Montreal
America/Nipigon
America/Thunder_Bay
America/Winnipeg
America/Rainy_River
America/Pangnirtung
America/Iqaluit
America/Rankin_Inlet
America/Cambridge_Bay
America/Regina
America/Swift_Current
America/Edmonton
America/Yellowknife
America/Inuvik
America/Dawson_Creek
America/Vancouver
America/Whitehorse
America/Dawson
America/Santiago
America/Bogota
America/Costa_Rica
America/Havana
America/Dominica
America/Santo_Domingo
America/Guayaquil
America/Grenada
America/Cayenne
America/Scoresbysund
America/Godthab
America/Thule
America/Guadeloupe
America/Guatemala
America/Guyana
America/Tegucigalpa
America/Port-au-Prince
America/Jamaica
America/St_Kitts
America/Cayman
America/St_Lucia
America/Martinique
America/Montserrat
America/Mexico_City
America/Cancun
America/Merida
America/Monterrey
America/Mazatlan
America/Chihuahua
America/Hermosillo
America/Tijuana
America/Managua
America/Panama
America/Lima
America/Miquelon
America/Puerto_Rico
America/Asuncion
America/Paramaribo
America/El_Salvador
America/Grand_Turk
America/Port_of_Spain
America/New_York
America/Detroit
America/Louisville
America/Kentucky/Monticello
America/Indianapolis
America/Indiana/Marengo
America/Indiana/Knox
America/Indiana/Vevay
America/Chicago
America/Menominee
America/Denver
America/Boise
America/Shiprock
America/Phoenix
America/Los_Angeles
America/Anchorage
America/Juneau
America/Yakutat
America/Nome
America/Adak
America/Montevideo
America/St_Vincent
America/Caracas
America/Tortola
America/St_Thomas
Europe/Andorra
Europe/Tirane
Europe/Vienna
Europe/Sarajevo
Europe/Brussels
Europe/Sofia
Europe/Minsk
Europe/Zurich
Europe/Prague
Europe/Berlin
Europe/Copenhagen
Europe/Tallinn
Europe/Madrid
Europe/Helsinki
Europe/Paris
Europe/London
Europe/Belfast
Europe/Gibraltar
Europe/Athens
Europe/Zagreb
Europe/Budapest
Europe/Dublin
Europe/Rome
Europe/Vaduz
Europe/Vilnius
Europe/Luxembourg
Europe/Riga
Europe/Monaco
Europe/Chisinau
Europe/Tiraspol
Europe/Skopje
Europe/Malta
Europe/Amsterdam
Europe/Oslo
Europe/Warsaw
Europe/Lisbon
Europe/Bucharest
Europe/Kaliningrad
Europe/Moscow
Europe/Samara
Europe/Stockholm
Europe/Ljubljana
Europe/Bratislava
Europe/San_Marino
Europe/Istanbul
Europe/Kiev
Europe/Uzhgorod
Europe/Zaporozhye
Europe/Simferopol
Europe/Vatican
Europe/Belgrade
Australia/Lord_Howe
Australia/Hobart
Australia/Melbourne
Australia/Sydney
Australia/Broken_Hill
Australia/Brisbane
Australia/Lindeman
Australia/Adelaide
Australia/Darwin
Australia/Perth
Africa/Luanda
Africa/Ouagadougou
Africa/Bujumbura
Africa/Porto-Novo
Africa/Gaborone
Africa/Kinshasa
Africa/Lubumbashi
Africa/Bangui
Africa/Brazzaville
Africa/Abidjan
Africa/Douala
Africa/Djibouti
Africa/Algiers
Africa/Cairo
Africa/El_Aaiun
Africa/Asmera
Africa/Ceuta
Africa/Addis_Ababa
Africa/Libreville
Africa/Accra
Africa/Banjul
Africa/Conakry
Africa/Malabo
Africa/Bissau
Africa/Nairobi
Africa/Monrovia
Africa/Maseru
Africa/Tripoli
Africa/Casablanca
Africa/Bamako
Africa/Timbuktu
Africa/Nouakchott
Africa/Blantyre
Africa/Maputo
Africa/Windhoek
Africa/Niamey
Africa/Lagos
Africa/Kigali
Africa/Khartoum
Africa/Freetown
Africa/Dakar
Africa/Mogadishu
Africa/Sao_Tome
Africa/Mbabane
Africa/Ndjamena
Africa/Lome
Africa/Tunis
Africa/Dar_es_Salaam
Africa/Kampala
Africa/Johannesburg
Africa/Lusaka
Africa/Harare
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器