整理下JDK8以后针对时间的加强处理
参考资料:
- Java 8 日期时间 API | 菜鸟教程
此类的对象表示时间线上的一点。可以理解为人类的绝对时间。
因为是时间线的一点,所以时间点可以比较大小,那么这个时间点的标准都是统一的;即这个时间点对于整个地球人们来说是唯一的,不是北京时间、也不是东京时间、而是世界时间。
时间线时间点在时间线上(点在线上)。时间线上有三个重要的点:最大值点、最小值点、原点。
Java时间线上的时间的原点是:(由此可见Java的时间原点就是1970年01月01日00时00分00秒.另外我们一般用北京时间,所以我们的时间戳应该是1970年01月01日08时00分00秒,逗是在原来的基础上加8小时cuiyaonan2000@163.com)
Java时间线上的最大时间是 (这个相当于是人为的设置了一个无限大的年份.即10亿年,现在才是2022年^_^,所以时间是够用的)
Java时间线上的最小时间是 (这个相当于是人为的设置了一个最小的年份.即负的10亿年,那为什么原点是1970年呢,因为把原点设置在1970年没有任何的现实问题,也可以设置1971年或者1969年,大家的约定而已cuiyaonan2000@163.com)
时间单位
年、月、日、时、分、秒都是时间的单位。 现在人们把控自己生活节奏已经到了分钟这个单位;而科技的进步要求把控我们的机器的时间单位是秒、毫秒、纳秒。
-
非线程安全 − java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。----java.time的时间对象所有操作都是创建一个新的时间对象,而不是修改原来的时间对象cuiyaonan2000@163.com
-
设计很差 − Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。---------------java.util.Date不是final类,java.sql.Date集成了它,且仅包含了日期cuiyaonan2000@163.com
-
时区处理麻烦 − 日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。
Java 8 在 java.time 包下提供了很多新的 API。以下为两个比较重要的 API:
-
Local(本地) − 简化了日期时间的处理,没有时区的问题。
-
Zoned(时区) − 通过制定的时区处理日期时间。
新的java.time包涵盖了所有处理日期,时间,日期/时间,时区,时刻(instants),过程(during)与时钟(clock)的操作。
新版时间处理关于时间的处理.这次JDK8 进行了归纳.统一放置在了如下的目录下,不会像之前那样关于时间的处理分散在各个包下的情况cuiyaonan2000@163.com
Calendar类都可以被新的api取代,新的api的大多数类都是线程安全的,加减时间返回的都是一个新的实体,不会改变原来对象的属性。
package java.time;
该包下的类如下所示:
根据实际情况,时间对象有3中状态.即:日期,时间,日期+时间.这3中组合,分别对应的对象是cuiyaonan2000@163.com:
- LocalDate: 针对日期的处理 格式: 2012-03-10
- LocalTime: 针对时间的处理 格式: 11:03:25.542
- LocalDateTime: 针对时间与日期的处理 格式: 2012-03-10 11:03:25.542
用例
package cui.yao.nan.highlevetest.forkjoin;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;
/**
* @Author: cuiyaonan2000@163.com
* @Description: todo
* @Date: Created at 2022-3-15 10:51
*/
public class TestDate {
public static void main(String[] args){
// 基于系统的zone,获取系统的日期时间对象
LocalDateTime currentTime = LocalDateTime.now();
System.out.println("当前时间: " + currentTime);
//字符串转换成localdatetime
LocaDateTime ldt = LocalDateTime.parse("2011-11-11 22:11:11",DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//时间戳转换成localdatetime
LocalDateTime ldt = Instant.ofEpochMilli(System.currentTimeMillis()).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
//根据日期时间对象获取日期对象
LocalDate date1 = currentTime.toLocalDate();
System.out.println("date1: " + date1);
//获取日期的年月日时分秒的方法
Month month = currentTime.getMonth();
int day = currentTime.getDayOfMonth();
int seconds = currentTime.getSecond();
System.out.println(currentTime.getMonthValue());
System.out.println("月: " + month +", 日: " + day +", 秒: " + seconds);
//设置年月日时分秒的方法
LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012);
System.out.println("date2: " + date2);
LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);
System.out.println("date3: " + date3);
LocalTime date4 = LocalTime.of(22, 15);
System.out.println("date4: " + date4);
//根据字符串解析日期时间的方法
LocalTime date5 = LocalTime.parse("20:15:30");
System.out.println("date5: " + date5);
//日期格式化输出
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分s秒SSS毫秒");
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.format(dtf));
}
}
LocalDate,LocalTime,LocalDateTime 的Api肯定是相似的,包含了时间的几乎所有的处理.如下的是时间的相互比较的Api
年月日的增删改查方法:
区别与LocalDateTime,LocalDate,LocalTime.Instant时间戳类的新替代.
具体参考
package cui.yao.nan.highlevetest.forkjoin;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjuster;
/**
* @Author: cuiyaonan2000@163.com
* @Description: todo
* @Date: Created at 2022-3-15 10:51
*/
public class TestDate {
public static void main(String[] args){
//获取的是默认时区,获取的不是中国 的时区,是没过的时区
Instant now = Instant.now();
System.out.println(now);
//将字符串转换为时间戳,该格式是有要求的不能随便搞
//T表示分隔符,Z表示的是UTC。
//UTC:世界标准时间,在标准时间上加上8小时,即东八区时间,也就是北京时间。
//北京时间:2020-01-14 00:00:00对应的国际标准时间格式为:2020-01-13T16:00:00.000Z
Instant.parse("1970-02-01T00:00:00Z")
//获取当前时区的,我们可以添加偏移量,返回偏移过后的日期. 设置8个时区的偏移量就是中国china
OffsetDateTime offsetDateTime = now.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);
System.out.println("===========================");
//toEpochMilli():从1970 -01 - 01 00:00:00 截止到当前时间间隔的毫秒值
long l1 = now.toEpochMilli();
System.out.println(l1);
//获取从1970 -01 - 01 00:00:00 截止到当前时间间隔的秒值
long epochSecond = now.getEpochSecond();
System.out.println(epochSecond);
//把获取到的当前时间的秒数 换算成纳秒
long namioa = now.getNano();
System.out.println(namioa);
//时间线上的最小值
//-1000000000-01-01T00:00:00Z
System.out.println(Instant.MIN);
//时间的原点,我们现在所有时间都是基于该时间
//1970-01-01T00:00:00Z
System.out.println(Instant.EPOCH);
//所能支持的最大时间年份
//+1000000000-12-31T23:59:59.999999999Z
System.out.println(Instant.MAX);
}
}
另增加毫秒数
ofEpoch系列方法:
- ofEpochSecond(): 给计算机元年增加秒数
- ofEpochMilli(): 给计算机元年增加毫秒数
- 静态方法 between(): 计算两个时间的间隔,默认是秒
- toDays(): 将时间转换为以天为单位的
- toHours(): 将时间转换为以时为单位的
- toMinutes(): 将时间转换为以分钟为单位的
- toMillis(): 将时间转换为以毫秒为单位的
- toNanos(): 将时间转换为以纳秒为单位的
package cui.yao.nan.highlevetest.forkjoin;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjuster;
/**
* @Author: cuiyaonan2000@163.com
* @Description: todo
* @Date: Created at 2022-3-15 10:51
*/
public class TestDate {
public static void main(String[] args){
//计算时间的间隔
Instant start = Instant.now();
for (int i = 0; i < 15; i++) {
System.out.println(i);
}
Instant end = Instant.now();
Duration duration = Duration.between(start, end);
long l = duration.toNanos();
//间隔的时间
System.out.println("循环耗时:"+l+"纳秒");
}
}
Period计算2个日期的间隔
- 静态方法 between(): 计算两个日期之间的间隔
- getYears(): 获取年份
- getMonths(): 获取月份
- getDays(): 获取天数
-
ZonedDate 对应LocalDate,只是没有带时区
-
ZonedTime 对应ZonedTime,只是没有带时区
-
,ZonedDateTime 对应ZonedDateTime,只是没有带时区
package cui.yao.nan.highlevetest.forkjoin;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjuster;
import java.util.Set;
/**
* @Author: cuiyaonan2000@163.com
* @Description: todo
* @Date: Created at 2022-3-15 10:51
*/
public class TestDate {
public static void main(String[] args){
//ZoneID 世界时区类
//获取世界各地的时区编号。
Set availableZoneIds = ZoneId.getAvailableZoneIds();
for (String availableZoneId : availableZoneIds) {
System.out.println(availableZoneId);
}
System.out.println("=====================");
//获取系统的默认时区编号
ZoneId zoneId = ZoneId.systemDefault();
System.out.println(zoneId);
//获取其他国家的日期
LocalDateTime now = LocalDateTime.now();
//获取指定时区的日期时间
ZoneId zoneId1 = ZoneId.of("Europe/Monaco");
ZonedDateTime zonedDateTime = now.atZone(zoneId1); //获得指定时区的当前时间
System.out.println(zonedDateTime);
System.out.println("=====================");
//根据时区,获取该地区的日期
LocalDateTime now1 = LocalDateTime.now(ZoneId.of("America/Phoenix")); //获得指定时区的当前时间(不带时区信息)
System.out.println(now1);
}
}
ZoneId&ZoneOffset
- ZoneId: 用于保存了全世界各地的时区ID
- ZoneOffset: 用于时间上加减,转换不同的时区
ZoneId.getAvailableZoneIds()所包含的时区
[Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot,
Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo,
Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga,
America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama,
Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan,
Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental,
Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5,
Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3,
Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena,
Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, Asia/Samarkand,
America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska,
Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk,
America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo,
Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6,
Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion,
Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi,
Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Asia/Chita, Pacific/Easter,
Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, Asia/Tomsk, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca,
America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn,
America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, Europe/Saratov, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan,
Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla,
Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, Pacific/Bougainville, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta,
Africa/Ceuta, Asia/Barnaul, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Asia/Qostanay, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk,
Antarctica/Troll, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores,
Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam,
America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe,
America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center,
America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo,
America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Asia/Yangon, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Punta_Arenas, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang,
Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, Europe/Kirov, America/Resolute, Pacific/Kanton, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern,
Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul,
Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka,
Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Europe/Astrakhan, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay,
America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Asia/Atyrau, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Famagusta, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, America/Nuuk, Etc/GMT-10, SystemV/YST9YDT, Europe/Ulyanovsk, Etc/GMT-14,
Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Fort_Nelson, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, Asia/Srednekolymsk, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican,
Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco]
ZoneOffset调整到北京时间,如下源码也很简单,of()可以适配多种模式的时分秒的增加cuiyoanan2000@163.com
ZoneOffset.of("+8")
ZoneOffset.ofHours(8)