简介

本文主要是对Java中常用的时间类做一下梳理,包括Java 8中新增的日期/时间类等,以及它们和时区的关联性

Date / Calendar

java.util.Date 是最常用的类之一,它的精度为毫秒,因为它的有些地方不合理,后来出现了Calendar来替代。java.util.Date 本身存储的是时间戳(1970年1月1日 00:00:00 GMT以来此对象表示的毫秒数 ),所以它和时区地域是无关的,只是在显示的时候加载了TimeZone来调整了时间的显示。

Calendar的getInstance()方法有参数为TimeZone和Locale的重载,可以使用指定时区和语言环境获得一个日历。无参则使用默认时区和语言环境获得日历。

public static Calendar getInstance(){

return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));

}

// 重载的带有时区的方法

public static Calendar getInstance(TimeZone zone){

return createCalendar(zone, Locale.getDefault(Locale.Category.FORMAT));

}

我们来看下如下的代码

public class Te {

public static void main(String[] args) throws ParseException {

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

// 这边只是指定了这个SimpleDateFormat的时区为GMT时区,系统本身的时区还是默认的时区(中国时区)

dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));

Date date = new Date(1525518893403L);// 中国时间:2018-5-5 19:14:53

System.out.println(dateFormat.format(date));

// 字符串没有时区信息

String dateStr = "2018-05-05 19:14:53";

Date newDate = dateFormat.parse(dateStr);

System.out.println(newDate);

System.out.println(dateFormat.format(newDate));

}

}

output:

2018-05-05 11:14:53

Sun May 06 03:14:53 CST 2018 (对应的值为:2018-05-06 03:14:53)

2018-05-05 19:14:53

从上面的结果可以知道,Date是不带时区信息,所以在dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 后,输出的时间就是GMT时区的时间。

字符串的值被认为是GMT时间,所以newDate显示的时间是字符串时间 +8小时后的时间,从第三行输出也印证了这一点。

可以看到,上面的输出结果可能和我们预想的并不一致,Calendar 类作为新的类,没有那么复杂

public class Te {

public static void main(String[] args) throws ParseException {

Date date = new Date(1525518893403L);// 中国时间:2018-5-5 19:14:53

System.out.println(date);

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));

calendar.setTime(date);

System.out.println(calendar.getTime());

System.out.println(calendar.get(Calendar.YEAR) + "-" + calendar.get(Calendar.MONTH) + "-" +

calendar.get(Calendar.DAY_OF_MONTH) + " " +

calendar.get(Calendar.HOUR_OF_DAY) + ":" + calendar.get(Calendar.MINUTE) + ":" +

calendar.get(Calendar.SECOND));

}

}

output:

Sat May 05 19:14:53 CST 2018

Sat May 05 19:14:53 CST 2018

2018-4-5 11:14:53

可以看到,我们在使用Calendar的时候,获取时间不能直接使用getTime(),因为其返回的是一个Date,而Date是没有时区信息的,应该使用calendar.get()方法。

java.sql.Date / java.sql.Timestamp

这两个类都和数据库有关系,看报名就知道了。且他们都是java.util.Date 的子类。因此,类似的,他们也都没有时区信息。

java.sql.Date 是只保留年月日,而没有时分秒信息,对应数据库(eg. mysql)中的date类型.

java.sql.Timestamp 精确到纳秒,对应数据库(eg.mysql)中的timestamp类型

java8 新增的日期时间类

Instant:瞬时实例。

LocalDate:本地日期,不包含具体时间。例如:2014-01-14可以用来记录生日、纪念日、加盟日等。

LocalTime:本地时间,不包含日期。

LocalDateTime:组合了日期和时间,但不包含时差和时区信息。

ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。

Instant

Instant 以Unix时间戳的形式存储日期时间 ,精确到纳秒

// 获取当前的时间戳

Instant timestamp = Instant.now();

System.out.println(timestamp);

// 类似的,从指定的时间戳生成 Instant

Instant specificTime = Instant.ofEpochMilli(System.currentTimeMillis());

System.out.println(specificTime);

output:

2018-05-05T12:44:54.037Z

2018-05-05T12:44:54.195Z

Instant 和Date类似,没有时区信息(也可以认为是0时区,即GMT时区)

ZonedDateTime

java8 把时区也分离出来了,现在转换时区很方便。如果要显示指定的时区,可以使用 ZonedDateTime

ZonedDateTime result=ZonedDateTime.ofInstant(Instant.now(),ZoneId.systemDefault());

System.out.println(result);

// ZonedDateTime 底层就是用Instant存储的

System.out.println(result.toInstant());

output:

2018-05-05T20:52:04.096+08:00[Asia/Shanghai]

2018-05-05T12:52:04.096Z

下面这个例子是时区的转换

//获取当前时区的日期时间

ZonedDateTime now = ZonedDateTime.now();

System.out.println(now);

System.out.println(now.withZoneSameInstant(ZoneId.of("America/New_York")));

//获取美国洛杉矶时区的日期时间,写这段代码的时候,北京时间是 2018-05-05 21:53:26,下面等于是生成了了纽约时间 2018-05-05 21:53:26。因为ZonedDateTime底层是用Instant存储的,所以USANow内的Instant的值和上面now的Instant值是不相等的。

ZonedDateTime USANow = ZonedDateTime.of(LocalDateTime.now(), ZoneId.of("America/New_York"));

System.out.println(USANow);

System.out.println(USANow.withZoneSameInstant(ZoneId.systemDefault()));

output:

2018-05-05T21:53:26.322+08:00[Asia/Shanghai]

2018-05-05T09:53:26.322-04:00[America/New_York]

2018-05-05T21:53:26.356-04:00[America/New_York]

2018-05-06T09:53:26.356+08:00[Asia/Shanghai]

相比与之前的时区转换,ZonedDateTime的操作是简便了很多,更便于理解

LocalDate / LocalTime

如上面介绍的所示,一个只有日期,一个只有时间,两者都是没有指定时区的

​```java

LocalDate today = LocalDate.now();

System.out.println(today);

LocalTime now = LocalTime.now();

System.out.println(now);

output:

2018-05-05

21:00:27.979

LocalDate还提供了很多有用的方法

​```java

// 构造日期

LocalDate date = LocalDate.of(2016, 4, 18);

LocalDate date2 = LocalDate.of(2016, 5, 18);

//比较两者相等

if (!date.equals(date2)) {

System.out.printf("date %s 和 date2 %s 不是同一天!%n", date, date2);

}

LocalDateTime是两者的聚合体,这里就不写了,这些类都有一些很好用的方法,查API文档即可,这里就不浪费时间记述了,浪费大家的时间

java时间显示时区_Java 时间、日期与时区的关系相关推荐

  1. java时间格式转换_Java时间日期格式转换

    突然忘记了时间格式怎么转换,特此做个记录 Java时间格式转换大全 import java.text.*; import java.util.Calendar; public class VeDate ...

  2. java date 操作类_JAVA时间操作类常用方法汇总

    1.JAVA中日期的获取.设置和格式化 (1)JAVA提供了3个日期类:Date.Calendar和DateFormat. Date()方法主要用于创建日期对象并获取日期: Calendar()方法主 ...

  3. java格式化到毫秒_java时间格式化到毫秒

    (3)Java 日期时间及其格式化 可以用 System 类的静态方法 publ... java的时间处理续计算java时间)_计算机软件及应用_IT/计算机_专业资料.1. java 计算时间依靠 ...

  4. java my97时间显示节日_My97DatePicker时间控件使用说明

    常规调用: 常规调用(在文本框中尾部显示日期图标): 图标触发(此时只有点击图标才能弹出日期选择框): 禁止清空(即用户选择完日期后,不能直接在文本框中按detele键删掉或清空,只能重新选择日期) ...

  5. java定义时间格式大全_Java时间格式转换大全

    package com.date; import java.text.DateFormat; import java.text.ParseException; import java.text.Par ...

  6. java如何造假数据_JAVA时间数据造假

    //显示时间造假,只修改日期,保留 时分秒数据 /*List l2=new ArrayList(); for(int i=0;i WorkForm w1=(WorkForm)l.get(i); c2. ...

  7. java 时间戳 什么意思_java时间与时间戳

    (一)时间:当前时间 1.获取当前时间 Date date = new Date(); System.out.println(date); //Thu Dec 14 18:08:53 CST 2017 ...

  8. java时间格式大全_java时间格式大全

    java.util.*; import java.text.*; import java.util.Calendar; public class VeDate { /** * 获取现在时间 * * @ ...

  9. java 只显示文本文件_Java设计并实现一个应用程序,能够读取一个文本文件中的内容并显示,同时能够计算出文本中的行数。...

    展开全部 java编写显示文本的应用程序, 需要用到图形界面GUI编程技术. 步骤一: 需要搭建一个整体的外观32313133353236313431303231363533e4b893e5b19e3 ...

  10. java秒转换为年月日_java时间转化为年月日以及将秒转化为天小时分秒字符串显示总结...

    注意:php的后台的时间按照秒计算,android按照毫秒计算,所以时间 String getstrtime = Tool.getNormalTime(Long.parseLong(time + &q ...

最新文章

  1. 选redis还是memcache?
  2. AI算法图片转二次元卡通
  3. VS+VA 开发NDK
  4. 分布式文件服务器FastDFS
  5. C++利用线性探查实现存储机制hash table的算法(附完整源码)
  6. ubuntu每次启动都出现检测到错误
  7. java - 通用 CRUD(增、删、改、查)工具类,代码高效复用
  8. 虚拟化之四:虚拟化备份策略已成数据安全的焦点!
  9. 表格下拉_【职场充电】要说制作一个漂亮的表格,高手都爱WPS
  10. 【LeetCode 剑指offer刷题】矩阵题1:4 有序矩阵中的查找( 74. Search a 2D Matrix )(系列)...
  11. 如何使用 Windows 10 自带的磁盘清理程序?
  12. python绘制3d点云_python – 来自点云的3D凸包
  13. 摄像头的像素与分辨率之间的关系
  14. 【Linux】文件与路径
  15. 电子烟的使用方法及注意事项
  16. pycharm debug Can‘t process net command: 501 1 0.1 WIN
  17. 缺少msvcr100.dll的解决方法
  18. vii php,VIIShop php网上商店系统
  19. DDR2-DDR3-IP-CARE ---use
  20. Fresco原理分析

热门文章

  1. java short int 转换_基本类型'short'-Java中的强制转换
  2. 购物商城网站建设费用到底贵不贵?
  3. iOS-底层原理 06: cls 与类的关联原理
  4. 在一家公司干多长时间跳槽才合适?值得一读!
  5. 成功解决TypeError: only size-1 arrays can be converted to Python scalars
  6. 计算机打字考试的技巧,快速打字有什么技巧
  7. Android 多点触控
  8. 大连民族大学计算机科学学院,魏巍 - 大连民族大学 - 计算机科学与工程学院
  9. 12、Horizon 域控组策略管理
  10. 计算机学霸小黄是谁,人人网惊现“小黄鸡”火成一片 大学生调侃“你是学霸派来的么?”...