只有把眼前的事情做好,才能考虑其他的问题。
- 众所周知,全世界在同一时刻看手表肯定不会看到同一个时间,因为地球是圆的,面对太阳的角度是不一样的,我们一般说时间几点几点,是指的本地时间,比如国内大部分以北京时间为准
- 光靠本地时间是无法准确表示真正的时间,因为北京的本地时间和美国的本地时间肯定不是同一个时间,所以产生了时区这个概念,全球一共有24个时区,以伦敦为标准时区,其他市区按照东西偏移,北京所在市区是东八区。
- 时区一般由UTC表示,因为UTC更为标准,还有GMT基本等价于UTC。东八区一般用UTC+08:00
- 夏令时是更复杂的计算方式,通常夏天开始的时候把时间往后拨1小时,夏天结束往前拨1小时,不过中国已经废除,美国还在使用
- 计算机中,通常使用Local表示一个国家或者地区的日期、时间、数字、货币等格式,因为不同国家表示习惯不一样。zh_CN表示中文+中国,en_US表示英语+美国
时间戳
- 时间戳是从1970年1月1日(格林威治时区/GMT+00:00)开始到现在的秒数,然后根据各个时区转化为当地时间
- 可以使用
System.currentTimeMillis()
获取当前时间戳
Date基本用法
- Date定义在java.util包中,包中还包括Calendar和TimeZone
- 最新的JDK8+还有一套新的API,定义在java.time包中,主要包括LocalDateTime、ZonedDateTime、ZoneId
- 在java.sql中还有一个Date类,这个Date类用在户数据库中,要注意区分
public static void getDate() {System.out.println(System.currentTimeMillis());// 获取当前时间Date对象:Date date = new Date();System.out.println(date.getYear() + 1900); //获取当前年 必须加上1900System.out.println(date.getMonth() + 1); //获取当前月份 0~11,必须加上1System.out.println(date.getDate()); //获取当前日期 1~31,不能加1// 转换为String:System.out.println(date.toString());// 转换为GMT时区:System.out.println(date.toGMTString());// 转换为本地时区:System.out.println(date.toLocaleString());System.out.println((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date)); // 根据具体格式转化时间}
Calendar
- Calendar可以设置并获取年月日,和Date相比,多了一个时间计算的功能
public static void getCalendar() {// 获取当前时间:Calendar c = Calendar.getInstance();System.out.println(new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(c.getTime())); // getTime 转化为Date对象System.out.println(c.get(Calendar.YEAR)); // 获取年System.out.println(1 + c.get(Calendar.MONTH)); // 获取月System.out.println(c.get(Calendar.DAY_OF_MONTH)); // 获取日System.out.println(c.get(Calendar.DAY_OF_WEEK)); // 获取周几System.out.println(c.get(Calendar.HOUR_OF_DAY)); // 获取小时System.out.println(c.get(Calendar.MINUTE)); // 获取分钟System.out.println(c.get(Calendar.SECOND)); // 获取秒System.out.println(c.get(Calendar.MILLISECOND)); // 获取毫秒Calendar calendar = Calendar.getInstance();calendar.set(Calendar.YEAR,2011); // 设置年System.out.println(new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(calendar.getTime()));calendar.clear(); // 清除日期System.out.println(new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(calendar.getTime()));}
TimeZone
- 时区,可以用来获取时区,转换时区
public static void timeZoneDemo () {System.out.println(TimeZone.getDefault().getID());System.out.println(TimeZone.getTimeZone("GMT+10:00").getID()); // GMT+10:00 时区System.out.println(TimeZone.getTimeZone("Asia/Shanghai").getID());// 将上海时间转化为纽约时间Calendar calendar = Calendar.getInstance();calendar.clear();calendar.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));calendar.set(2020,1,2,3,04,0);SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println(simpleDateFormat.format(calendar.getTime()));simpleDateFormat.setTimeZone(TimeZone.getTimeZone("America/New_Yourk"));System.out.println(simpleDateFormat.format(calendar.getTime()));}
LocalDateTime
- LocalDateTime可以打印当前日期、时间,LocalDate可以打印当前日期,LocalTime可以打印当前时间
public static void getLocalDateDemo() {System.out.println(LocalDate.now());System.out.println(LocalTime.now());LocalDateTime now = LocalDateTime.now();System.out.println(now.toLocalDate()); // 转化为日期System.out.println(now.toLocalTime()); // 转化为时间System.out.println(LocalDateTime.of(2020,10,10,10,10,10));System.out.println(LocalDate.of(2020,10,10));System.out.println(LocalTime.of(10,10,10));System.out.println(LocalDateTime.parse("2020-10-10T10:10:10"));}
- LocalDateTime还提供了一系列对日期时间增减的方法
- plusDays 加天 、 minusDays 减天
- plusHours 加小时、 minusHours 减小时等...
- 可以针对年月日时间做调整
- 调整年:withYear()
- 调整月:withMonth()
- 调整日:withDayOfMonth()
- 调整时:withHour()
- 调整分:withMinute()
- 调整秒:withSecond()
- 比较时间可以使用LocalDateTime提供的方法
- isBefore() 是否在什么时间的前面
- isAfter()
- Duration 表示两个时刻之间的间隔 Duration.between(stratTime,endTime)
- Period 表示两个日期之间的间隔 LocalDate.of(2020,10,10).until(LocalDate.of(2020,10,1))
DateTImeFormatter
- DateTimeFormatter可以自定义输出格式,和自定义解析格式
public static void getDateTimeFormatterDemo () {System.out.println((DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")).format(LocalDateTime.now()));System.out.println(LocalDateTime.parse("2020/10/10 10:10:10",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")));}
ZonedDateTime
- ZonedDateTime可以获取一个带时区的时间
public static void getZonedDateTime() {System.out.println(ZonedDateTime.now()); // 获取当前时间-带时区System.out.println(ZonedDateTime.now(ZoneId.of("America/New_York"))); // 根据指定时区获取当前时间System.out.println((LocalDateTime.of(2020,10,10,10,10,10)).atZone(ZoneId.systemDefault())); //根据时区打印当前时间 System.out.println((LocalDateTime.of(2020,10,10,10,10,10)).atZone(ZoneId.of("America/New_York"))); // 根据指定时区打印当前时间ZonedDateTime zbj = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));ZonedDateTime zny = zbj.withZoneSameInstant(ZoneId.of("America/New_York")); // 时区转换}
本文作者《猿氏·凯》,如果雷同,纯属抄袭····