Java 各类时间日期相关的操做

目录

  一、获取当前时间的时间戳java

    1.一、时间进制sql

    1.二、获取毫秒级时间戳orm

    1.三、获取纳秒级时间戳对象

  二、java.util包blog

    2.一、Data接口

    2.二、Calendar字符串

  三、java.time包get

    3.一、LocalDate博客

    3.二、LocalTimeio

    3.三、LocalDateTime

    3.四、Clock

    3.五、Instant

  四、日期时间格式

    4.一、简单示例

    4.二、经常使用格式转换

  五、月份对应的英文

 

前言

  日常会遇到不少的日期格式,各类各样的,什么UTC、GMT、毫秒级、微秒级、纳秒级....这些格式,怎么建立这些格式很简单,可是,怎么将这几种格式进行相互转换,是一个问题!!!!因此我专门写一篇博客,作一下笔记吧,反正常常会用到。

  

一、获取当前时间的时间戳

  1.一、时间进制

  1秒=1000毫秒

  1秒=1000000微秒(1毫秒=1000微秒)

  1秒=1000000000纳秒(1微秒=1000纳秒) ( 1毫秒=1000000纳秒)

  

  要得到秒级时间戳,可使用毫秒级时间戳除以1000便可。

 

  1.二、获取毫秒时间戳

  获取毫秒时间戳的方式比较多,通常都是用System.currentTimeMillis()。

@Test
public void testTimeStamp() {

    // 得到当前时间的时间戳(13位),单位是毫秒
    // 方式1
    long timeStamp1 = System.currentTimeMillis();

    // 方式2
    Date date = new Date();
    long timeStamp2 = date.getTime();

    // 方式3
    Calendar calendar = Calendar.getInstance();
    long timeStamp3 = calendar.getTimeInMillis();

    // 方法4
    Clock clock = Clock.systemUTC();
    long timeStamp4 = clock.millis();

    // 打印时间戳示例
    String str = String.format("%s %s %s %s", timeStamp1, timeStamp2, timeStamp3, timeStamp4);
    System.out.println(str);
    // 1567942696718 1567942696718 1567942696728 1567942696731
}

  

  1.三、获取纳秒时间戳

  纳秒时间戳,好像用的不是特别多

System.out.println(System.nanoTime());

    

二、java.util包

  2.一、Date

  之因此使用java.util.Date指明Date类的包为java.util,是由于java.sql包中也有一个Date类。

  Date类的输出格式:Sun Sep 08 17:49:50 CST 2019

  Date类有不少方法都被废弃了,包括构造方法,因此经常使用的使用方法以下:

@Test
public void testDete() {
    // 利用当前时间戳建立的Date实例,底层调用System.currentTimeMillis()
    Date date1 = new Date();
    System.out.println(date1); // Sun Sep 08 17:49:50 CST 2019

    // 利用一个时间戳来建立Date对象(时间戳转Date对象)
    long timeStamp = System.currentTimeMillis() - 100; // 当前时间的100秒前
    Date date2 = new Date(timeStamp);

    // Date的compareTo,用于比较两个时间的前后
    int flag = date1.compareTo(date2);
    // date1.compareTo(date2)返回值分三种状况
    // flag = 0, 两个时间相同(时间戳相同)
    // flag = 1, date1 要晚于 date2(date1的时间戳大于date2的时间戳)
    // flag = -1,date1 要早于 date2(date1的时间戳小于于date2的时间戳)

    // 判断date1是否晚于date2
    boolean after = date1.after(date2);

    // 判断date1是否早于date2
    boolean before = date1.before(date2);

    // 获取date对象的时间戳(13位),毫秒
    timeStamp = date1.getTime();

    // 设置date对象的时间戳
    date1.setTime(timeStamp);
}

  建议不要使用Date类的废弃的API,有一个Date.getMonth()获取月份,是从0开始计数,也就是说,5月份,getMonth()的值是4。

 

  3.二、Calendar

  Calendar是一个抽象类,因此不能实例化,可是能够调用getInstance()静态方法得到Calendar实例。

@Test
public void testCalender() {
    // 调用静态方法获取Calendar实例(使用默认的TimeZone和Locale)
    Calendar calendar1 = Calendar.getInstance();

    // 获取时间戳(13位),毫秒
    long timeStamp = calendar1.getTimeInMillis();

    // 获取Date对象
    Date date1 = calendar1.getTime();

    // 设置时间
    Date date2 = new Date(System.currentTimeMillis() - 100);
    calendar1.setTime(date2);

    // 获取Calendar的字段值(好比YEAR、MONTH....)
    final int month = calendar1.get(Calendar.MONTH);
    System.out.println(month);  // 注意,month从0开始计算,9月返回8

    // 修改时间(为指定字段进行计算)
    calendar1.add(Calendar.YEAR, -1);   // 当前是2019年,这里将年份减1
    System.out.println(calendar1.get(Calendar.YEAR)); // 2018
    // 其余字段,好比月、天、时分秒的计算都是同样的作法

    // 获取某个字段的最大值(一样能够有对应的接口获取最小值)
    int maxDay = calendar1.getActualMaximum(Calendar.DAY_OF_MONTH);
    System.out.println(maxDay);  // 2018年9月,最多有30天

    Calendar calendar2 = Calendar.getInstance();

    // 设置指定字段值,注意,月份是从0开始计数
    calendar2.set(Calendar.YEAR, 2030);

    // 设置年月日
    calendar2.set(2029, 11, 5);
    System.out.println(calendar2.getTime());
    // Wed Dec 05 18:06:30 CST 2029

    // 设置年月日时分秒
    calendar2.set(2030,10, 4, 12, 58, 59);
}

  

 

三、java.time包的类

  3.一、LocalDate

  LocalDate能够说使用的比较多了,由于能够比较方便的获取、设置、修改日期,须要注意的是,LocalDate,从名称上就能看出,这是获取“本地”日期。

@Test
public void testLocalDate() {
    // 建立LocalDate对象
    LocalDate localDate = LocalDate.now();
    System.out.println(localDate);  // 2019-09-08

    final LocalDate localDate2 = localDate.minusDays(5);
    System.out.println(localDate);  // 2019-09-08  注意,并不会直接修改LocalDate对象
    System.out.println(localDate2); //2019-09-03

    // getXxxx获取年月日信息
    final int dayOfMonth = localDate.getDayOfMonth();
    System.out.println(dayOfMonth);

    // 设置时间为2019-11-20,月份从1开始
    LocalDate localDate3 = LocalDate.of(2019, 11, 20);
    System.out.println(localDate3); // 2019-11-20

    // 2019年的第100天
    LocalDate localDate4 = LocalDate.ofYearDay(2019, 100);
    System.out.println(localDate4); // 2019-04-10
    
    // 能够调用LocalData的minusXxx、plusXxx进行日期的计算,getXxx获取某项值
}

  

  3.二、LocalTime

  LocalTime,主要是对Time,也就是对时间的操做,而且是本地的时间

@Test
public void testLocalTime() {
    // 利用当前时间,建立LocalTime对象
    LocalTime localTime1 = LocalTime.now();
    System.out.println(localTime1);  // 18:59:31.848

    // 指定时-分,建立LocalTime对象,注意,小时范围为0-23
    LocalTime localTime2 = LocalTime.of(23, 59);
    System.out.println(localTime2); // 23:59  注意,输出没有秒数

    // 指定时-分-秒,建立LocalTime对象
    LocalTime localTime3 = LocalTime.of(12, 35, 40);
    System.out.println(localTime3); // 12:35:40

    // 额外指定纳秒
    LocalTime localTime4 = LocalTime.of(13, 20, 55, 1000);
    System.out.println(localTime4);

    // 指定一天中的第1000秒来建立LocalTime对象
    LocalTime localTime5 = LocalTime.ofSecondOfDay(1000);
    System.out.println(localTime5); // 00:16:40

    // 利用一天中的纳秒数来建立LocalTime对象
    LocalTime localTime6 = LocalTime.ofNanoOfDay(100000000);
    System.out.println(localTime6); // 00:00:00.100

    // 能够调用LocalTime的plusXxx,minusXxx进行时间计算,getXxx获取某项值
}

  

  3.三、LocalDateTime

  聪明的你,必定知道LocalDateTime其实就是LocalDate和LocalTime加在一块儿的类了,使用方式也是同样的。

@Test
public void testLocalDateTime() {
    LocalDateTime now = LocalDateTime.now();
    System.out.println(now);    // 2019-09-08T19:16:03.884

    // 利用LocalDate和LocalTime建立LocalDateTime实例
    LocalDateTime localDateTime1 = LocalDateTime.of(LocalDate.now(), LocalTime.now());
    System.out.println(localDateTime1); // 2019-09-08T19:18:36.934

    // of用法和LocalDate和LocalTime的of用法同样,综合在一块儿了而已
    LocalDateTime localDateTime2 = LocalDateTime.of(2019, 5, 30, 12, 50, 45);
    System.out.println(localDateTime2); // 2019-05-30T12:50:45

    // 能够调用LocalDateTime的minusXxx,plusXxx来进行日期和时间的操做,使用getXxx获取某个项的值
}

  

  3.四、Clock

  Clock,时钟,用法以下:

@Test
public void testClock() {
    Clock clock = Clock.systemUTC();

    // 获取时区
    final ZoneId zone = clock.getZone();
    System.out.println(zone);       // Z

    // 获取时间戳(13位),毫秒
    long timeStamp = clock.millis();
    System.out.println(timeStamp);  // 1567942442222
}

  

  3.五、Instant

  Instant基本没用过(对于我而言)

@Test
public void testInstant() {
    Instant instant = Instant.now();
    System.out.println(instant);    // 2019-09-08T11:39:29.194Z

    final Instant parse = Instant.parse("2019-09-08T11:39:29.109000000Z");
    System.out.println(parse);      // 2019-09-08T11:39:29.109Z
    
    // 能够调用plusXxx,minusXxx进行时间计算
}

  

 四、日期时间格式

  日期时间格式,可使用SimpleDateFormat类进行自定义设置;

  4.一、简单示例

@Test
public void testSimpleDateFormat() {
    Date date = new Date();
    System.out.println(date);       // Sun Sep 08 19:49:57 CST 2019

    // 建立想要显示的格式
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    final String dateStr = formatter.format(date);
    System.out.println(dateStr);    // 2019-09-08 19:49:57
}

  

  4.一、经常使用格式转换

  格式有不少种,业务不一样,时间的格式也是不一样的,可是能够掌握一下规律

/**
 * 将UTC时间进行转换
 * 好比  2019-09-08T19:49:57Z
 *      2019-09-08T19:49:57.100Z
 *      2019-09-08T19:49:57.100000000Z
 *      2019-09-08T19:49:57.100000000 CST
 * 转换为
 *      2019-09-08 19:49:57
 */
@Test
public void parse1() {

    // 要解析的时间字符串
    String src = "2019-09-08T19:49:57.100000000Z CST";

    // 解析日期时,下面这个格式是通用的
    SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    
    // 目标格式
    SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try {
        Date date = formatter1.parse(src);
        String dateStr = formatter2.format(date);
        System.out.println(dateStr);   // 2019-09-08 19:49:57
    } catch (ParseException e) {
        e.printStackTrace();
    }
}

  

 

/**
 * 生成GMT格式的时间:Thu, 15 Sep 2011 12:13:41 GMT
 */
@Test
public void testToGMT() {
    SimpleDateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
    String str = formatter.format(new Date());
    System.out.println(str); // Sun, 08 Sep 2019 23:01:35 GMT
}

  

/**
 * 时间计算
 *
 * @param datatime 字符串形式的日期时间,好比2019-10-09 20:03:00
 * @param seconds  增减多少秒
 * @return
 */
public String computeDateTime(String datatime, int seconds) {
    if (seconds == 0) {
        return datatime;
    }

    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = null;
    try {
        date = formatter.parse("2019-10-09 20:03:00");
        long resMillSecond = date.getTime() + seconds * 1000;
        return formatter.format(new Date(resMillSecond));
    } catch (ParseException e) {
        e.printStackTrace();
    }

    return datatime;
}

public void testTime() throws ParseException {
    System.out.println(computeDateTime("2018-10-09 20:03:00", 4));  // 2018-10-09 20:02:56
    System.out.println(computeDateTime("2018-10-09 20:03:00", -4)); // 2018-10-09 20:03:04
}

  

 

 

 

 

五、月份对应的英文

月份 英文
1月  January
2月  February
3月 march 
4月 April 
5月  May
6月  June
7月  July
8月  August
9月  September
10月  October
11月 November 
12月  December
相关文章
相关标签/搜索