一、JDK1.8前

1、java.util.Date

1、只用于显示系统时间,其大部分操作由Calendar代替。
格林威治时间(GMT):指的是1970年1月1日0时,不同地区有时间差。
默认输出格式:星期、月、日、时、分、秒、时区、年
2、构造方法:
(1)public Date(); 无参构造创建的对象可以获取本机的当前日期与时间。
(2)public Date(long date); 根据自定义时间创建Date对象。date若为正数,则表示公元后,若为负数,则表示公元前。
3、常用方法:
(1)public long getTime(); 可以获取从1970年开始到现在时间的毫秒数。
(2)public void setTime(long time); 可以自定义date时间。

  1. import java.util.Date;
  2. public class Demo {
  3. public static void main(String[] args) {
  4. Date date = new Date();// 实例化一个Date类,用于获取当前系统时间
  5. System.out.println(date);// 输出时间,Thu May 23 14:10:49 JST 2019
  6. System.out.println(date.getTime());// 输出毫秒值,1558588249722
  7. date.setTime(date.getTime() + 1000);// 手动增加1000毫秒
  8. System.out.println(date.getTime());// 输出毫秒值,1558588250722
  9. }
  10. }

2、java.text.SimpleDateFormat

1、java1.5版本前,使用该类作用是将字符串(String)与时间(Date)相互转换。
2、构造方法:
(1)public SimpleDateFormat(); 按照系统默认格式将Date转换为String。
(2)public SimpleDateFormat(String pattern); 按照自定义格式pattern转换。
3、常用方法:
(1)public final String format(Date date); 可以将Date转为String。
(2)public Date parse(String source) throws ParseException; 可以将String转为Date,使用时需要抛出异常(ParseException)。
4、格式规则:
y—年 M—月 d—日 E—星期 h—12进制小时 H—24进制小时 m—分 s—秒

  1. import java.text.ParseException;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. public class Demo {
  5. public static void main(String[] args) {
  6. Date date = new Date();// 实例化一个Date类,用于获取当前系统时间
  7. System.out.println(date);// 输出时间,Thu May 23 14:36:10 JST 2019
  8. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd E HH-mm-ss");
  9. String str = sdf.format(date);// 按照指定格式转为字符串
  10. System.out.println(str);// 输出转换后的时间,2019-05-23 星期四 14-36-10
  11. try {
  12. // 将字符串转为Date,Thu May 23 14:36:10 JST 2019
  13. System.out.println(sdf.parse(str));
  14. } catch (ParseException e) {
  15. System.out.println("格式转换异常。");
  16. }
  17. }
  18. }

3、java.util.Calendar

1、Calendar类是一个抽象类,不能被实例化,可以通过静态方法getInstance()初始化一个日历对象。默认为当前系统时间。该类用于封装日历信息,并对时间分量(年、月、日、时、分、秒)进行计算。
2、常用方法:
(1)public final Date getTime(); 将Calendar转为Date型。
(2)public final void setTime(Date date); 将Date型转为Calendar。
(3)public int get(int field);用于获取时间分量。其中field使用Calendar类的静态变量表示。

注意:
Calendar.Month 从0开始计数,即0表示1月,11表示12月。
Calendar.DAY_OF_WEEK 从1开始计数,即1表示星期天,7表示星期六。

(4)public void set(int field, int value);设置时间分量,value指要设置的值。
(5)public final void set(int year, int month, int date); 设置年月日。
(6)public int getActualMaximum(int field); 获取时间分量field的最大值。
(7)abstract public void add(int field, int amount); 加时间分量,若加天数时,field需使用Calendar.DAY_OF_YEAR

  1. import java.util.Calendar;
  2. import java.util.Date;
  3. public class Demo {
  4. public static void main(String[] args) {
  5. Date date = new Date();// 获取系统时间
  6. System.out.println(date);// 输出系统时间,Thu May 23 15:46:00 JST 2019
  7. date.setTime(date.getTime() + 1000 * 60);// 设置时间
  8. Calendar calendar = Calendar.getInstance();// 获取日历类
  9. calendar.setTime(date);// 将Date转为Calendar
  10. System.out.println(calendar.getTime()); // 将Calendar转为Date,Thu May 23 15:47:00 JST 2019
  11. System.out.println(calendar.get(Calendar.MONTH)); // 获取月份,输出4,4表示5月
  12. System.out.println(calendar.get(Calendar.DAY_OF_WEEK));// 获取星期几,输出5,5表示星期四
  13. calendar.set(Calendar.DAY_OF_WEEK, 6);// 设置星期为星期5
  14. System.out.println(calendar.get(Calendar.DAY_OF_WEEK));// 输出星期几,输出6,表示星期五。
  15. System.out.println(calendar.getActualMaximum(Calendar.DAY_OF_MONTH));// 获取这个月最大的天数,输出31
  16. calendar.add(Calendar.DAY_OF_WEEK, 2);// 给星期加2天
  17. System.out.println(calendar.get(Calendar.DAY_OF_WEEK));// 输出1,表示星期天。
  18. }
  19. }

二、JDK1.8后

1、java.time包

java.time包是在JDK 8 之后引入的,提供了用于日期、时间、周期等的API。其所有类均为不可变的,线程安全的。
常用类:
(1)java.time.LocalDateTime:存储了时间与日期,格式为:年-月-日T时:分:秒.毫秒。比如:2019-05-23T12:51:36.494,可以使用withNano(0)将毫秒值设为0。
(2)java.time.LocalDate:存储了日期,格式为:年-月-日。比如:2019-05-23。
(3)java.time.LocalTime:存储了时间,格式为:时:分:秒.毫秒。比如:12:53:44.954。可以使用withNano(0)将毫秒值设为0。
(4)java.time.format.DateTimeFormatter:类似于java.text.SimpleDateFormat。但其只用来创建日期的显示模板,parse()(是一种静态方法)与format()方法需要使用LocalDateTime类来调用。
(5)java.time.Duration: 此类用来计算两同类型日期的时间差。

  1. import java.sql.Time;
  2. import java.time.LocalDate;
  3. import java.time.LocalDateTime;
  4. import java.time.LocalTime;
  5. import java.util.Date;
  6. public class Test {
  7. public static void main(String args[]) {
  8. // java.time.LocalDateTime,格式为:年-月-日T时:分:秒.毫秒
  9. LocalDateTime ldt = LocalDateTime.now();
  10. System.out.println(ldt);// 输出2019-05-23T12:51:36.494
  11. System.out.println(ldt.withNano(0));// 将毫秒设为0,输出为2019-05-23T12:55:13
  12. // java.time.LocalDate,格式为:年-月-日
  13. LocalDate ld = LocalDate.now();
  14. System.out.println(ld);// 输出2019-05-23
  15. // java.time.LocalTime,格式为:时:分:秒.毫秒
  16. LocalTime lt = LocalTime.now();
  17. System.out.println(lt);// 输出为12:53:44.954
  18. }
  19. }

注意:
(1)java.time中,星期一的值为1,星期天的值为7.且月份从 1~12。
(2)java.util.Calendar中,星期天为1,星期六为7,且月份从 0~11。
(3)对于time相关类,属于不可变类,原理类似String(参考String值变化的情况)。若其值改变,会重新创建一个实例。

  1. import java.time.LocalDate;
  2. import java.time.LocalDateTime;
  3. public class Demo {
  4. public static void main(String[] args) {
  5. LocalDateTime ldt = LocalDateTime.now(); // 获取当前系统时间
  6. System.out.println("当前时间为: " + ldt);
  7. System.out.println("当前年: " + ldt.getYear());
  8. System.out.println("当前月: " + ldt.getMonthValue());
  9. System.out.println("当前月中的日: " + ldt.getDayOfMonth());
  10. System.out.println("当前星期: " + ldt.getDayOfWeek());
  11. System.out.println("当前年中的日: " + ldt.getDayOfYear());
  12. System.out.println("当前时:(24小时制) " + ldt.getHour());
  13. System.out.println("当前分: " + ldt.getMinute());
  14. System.out.println("当前秒: " + ldt.getSecond());
  15. System.out.println("当前毫秒: (末尾加6个0)" + ldt.getNano());
  16. System.out.println();
  17. LocalDateTime time = LocalDateTime.of(2019, 05, 23, 11, 24, 21);
  18. System.out.println("自定义时间为: " + time);
  19. LocalDateTime newTime = time.plusYears(1);
  20. System.out.println("给时间增加一年: " + newTime);
  21. LocalDateTime lastTime = time.minusMonths(2);
  22. System.out.println("给月份减二月: " + lastTime);
  23. LocalDateTime changeTime = time.withDayOfMonth(13);
  24. System.out.println("只修改日: " + changeTime);
  25. LocalDate ld = LocalDate.now();//此处不是LocalDateTime
  26. String flag = (ld.isLeapYear() == true) ? "是" : "不是";
  27. System.out.println("判断是否为闰年: " + ld.getYear() + flag + "闰年");
  28. }
  29. }
  30. /*
  31. 测试结果:
  32. 当前时间为: 2019-05-23T18:17:01.454
  33. 当前年: 2019
  34. 当前月: 5
  35. 当前月中的日: 23
  36. 当前星期: THURSDAY
  37. 当前年中的日: 143
  38. 当前时:(24小时制) 18
  39. 当前分: 17
  40. 当前秒: 1
  41. 当前毫秒: (末尾加6个0)454000000
  42. 自定义时间为: 2019-05-23T11:24:21
  43. 给时间增加一年: 2020-05-23T11:24:21
  44. 给月份减二月: 2019-03-23T11:24:21
  45. 只修改日: 2019-05-13T11:24:21
  46. 判断是否为闰年: 2019不是闰年
  47. */

2、java.time.LocalDateTime

1、常用方法:
(1)public static LocalDateTime now(); 静态方法,获取当前系统时间。
(2)public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second) ; 静态方法,自定义时间
(3)public int getYear();获取年
(4)public LocalDateTime plusYears(long years); 增加年,会返回一个新的实例,若参数为负,也会出现减的效果。,
(5)public LocalDateTime minusMonths(long months);减月,会返回一个新的实例,若参数为负,会出现加的效果。
(6)public LocalDateTime withDayOfMonth(int dayOfMonth); 修改日,会返回一个新的实例。

3、java.time.format.DateTimeFormatter

1、类似于java.text.SimpleDateFormat。但其只用来创建日期的显示模板。
2、parse()方法是一种静态方法,使用LocalDateTime.parse()来调用。
3、format()方法需要使用LocalDateTime等类来调用。

  1. import java.text.ParseException;
  2. import java.text.SimpleDateFormat;
  3. import java.time.LocalDateTime;
  4. import java.time.format.DateTimeFormatter;
  5. import java.time.format.DateTimeParseException;
  6. import java.util.Date;
  7. public class Test {
  8. public static void main(String args[]) {
  9. // JDK 8之前,String转Date, Date转String如下:
  10. Date date = new Date();// 实例化一个Date,用于获取当前系统时间。
  11. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");// 定义一个格式
  12. System.out.println(date);// 输出当前系统时间
  13. System.out.println(sdf.format(date)); // 将Date转为String
  14. try {
  15. // 将String转为Date,此处需要抛出异常
  16. System.out.println(sdf.parse("2019-5-24"));
  17. } catch (ParseException e) {
  18. System.out.println("格式转换失败!");
  19. }
  20. // JDK 8后,引入新的日期类,String与Date互转如下:
  21. LocalDateTime ldt = LocalDateTime.now();// 获取当前系统时间
  22. // 定义格式
  23. DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  24. System.out.println(ldt);// 输出当前系统时间
  25. System.out.println(ldt.format(dtf));// 将Date转为String
  26. try {
  27. // 将String转为Date,注意,此处必须严格按照格式匹配,例如:MM不能写成5,只能写成05
  28. // 此处会抛异常
  29. System.out.println(LocalDateTime.parse("2019-5-24 12:22:33", dtf));
  30. } catch (DateTimeParseException e) {
  31. System.out.println("格式转换失败!");
  32. }
  33. // 这是正确的写法。注意LocalDateTime的格式为:yyyy-MM-dd HH:mm:ss
  34. // 而LlocalDate的格式为:yyyy-MM-dd,此处需要注意一下格式的写法。
  35. System.out.println(LocalDateTime.parse("2019-05-24 12:22:33", dtf));
  36. }
  37. }
  38. /*
  39. 测试结果:
  40. Fri May 24 10:58:09 JST 2019
  41. 2019-05-24
  42. Fri May 24 00:00:00 JST 2019
  43. 2019-05-24T10:58:09.681
  44. 2019-05-24 10:58:09
  45. 格式转换失败!
  46. 2019-05-24T12:22:33
  47. */

4、java.time.Duration

此类用来计算两同类型日期的时间差。

  1. import java.time.Duration;
  2. import java.time.LocalDateTime;
  3. public class Demo {
  4. public static void main(String[] args) {
  5. LocalDateTime start = LocalDateTime.of(2019, 5, 2, 12, 1);// 获取开始日期
  6. LocalDateTime end = LocalDateTime.of(2019, 6, 1, 13, 1);// 获取结束日期
  7. Duration result = Duration.between(start, end);// 用于计算相差的日期
  8. System.out.println(result.toDays());// 相差的天
  9. System.out.println(result.toHours());// 相差的时间
  10. System.out.println(result.toMinutes());// 相差的分钟
  11. System.out.println(result.toMillis());// 相差的秒数
  12. System.out.println(result.toNanos());// 相差的毫秒数
  13. }
  14. }
  15. /*
  16. 测试结果:
  17. 30
  18. 721
  19. 43260
  20. 2595600000
  21. 2595600000000000
  22. */

三、时间戳

1、java.sql.Timestamp

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
时间戳就是一种精度很高的类型,通常用来防止数据出现脏读现象,主要用在数据库上。
一般数据库里用Date这个类取出来的时候只能到精确到某一日;
但是Timestamp的话,可以精准到时间纳秒级别。

  1. package cn.xxs;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. public class Time {
  5. public static void main(String[] args) {
  6. String res = "2018-12-18 10:04:59";/** 时间 */
  7. int s = 1545098699;/** 时间戳 */
  8. System.out.println("时间戳转换为时间:"+stampToDate(s));/** 时间戳转换为时间 */
  9. System.out.println("时间转换为时间戳:"+dateToStamp(res));/** 时间转换为时间戳 */
  10. }
  11. /*
  12. * 将时间转换为时间戳
  13. */
  14. public static String dateToStamp(String s){
  15. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  16. String res = "";
  17. if (!"".equals(s)) {
  18. try {
  19. res = String.valueOf(sdf.parse(s).getTime()/1000);
  20. } catch (Exception e) {
  21. System.out.println("传入了null值");
  22. }
  23. }else {
  24. long time = System.currentTimeMillis();
  25. res = String.valueOf(time/1000);
  26. }
  27. return res;
  28. }
  29. /*
  30. * 将时间戳转换为时间
  31. */
  32. public static String stampToDate(int time){
  33. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  34. String times = format.format(new Date(time * 1000L));
  35. // System.out.println("日期格式---->" + times);
  36. return times;
  37. }
  38. }

2、获取时间戳的方法

1、public static native long currentTimeMillis(); //java.lang.System类,获取时间戳
2、public long getTime(); //java.util.Date类,可以获取从1970年开始到现在时间的毫秒数。
3、public long getTimeInMillis();//java.util.Calendar类,获取时间戳。
4、currentTimeMillis获取时间戳的速度最快。


参考资料: Java基础—常用API—日期相关API