Java获取时间&时间格式化最全总结

Java获取时间&时间格式化最全总结

最近遇到很多在Java里获取当前时间的问题,有的要求五花八门的,今天总结一下在Java中获取时间的方法和时间输出的格式化。

获取方式

java.util.Date

这个是我们最常用的,直接通过util包下得到当前时间通过SimpleDateFormat格式化后输出

//通过util下的Date包实现
        Date date = new Date();
        SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        System.out.println(dateFormat.format(date));

格式化的输出和不格式化的输出

image-20200928093839677

显然不格式化的代码可读性不如格式化后的,在实际开发场景中更需要不同的格式化要求,讲完如何获取之后,后面会讲时间的各种格式化。

在java8中的新特性里提供了三种时间类LocalDate、LocalTime、LocalDateTime

*这三个都在java.time包下,后续标题省略包名

LocalDate

如果你只需要获取年月日,则用这个再好不过,

//获取当前年月日
LocalDate localDate = LocalDate.now();
System.out.println(localDate);

他的输出就是yyyy-mm-dd

你也可以通过构造方法构造指定的年月日

LocalDate localDate1 = LocalDate.of(2077, 7, 17);

image-20200928094535473

三个参数已经提示的很清晰

当然,也可以用这个获取单个年月日、星期等

int year = localDate.getYear();
int year1 = localDate.get(ChronoField.YEAR);
Month month = localDate.getMonth();
int month1 = localDate.get(ChronoField.MONTH_OF_YEAR);
int day = localDate.getDayOfMonth();
int day1 = localDate.get(ChronoField.DAY_OF_MONTH);
DayOfWeek dayOfWeek = localDate.getDayOfWeek();
int dayOfWeek1 = localDate.get(ChronoField.DAY_OF_WEEK);

月份和星期可以获得指定英文格式,如上。输出结果如下

image-20200928094921246

LocalTime

如果只获取时分秒,那就用这个吧~

LocalTime localTime = LocalTime.now();
System.out.println(localTime);

这个也是一样,除了获取当前,也是可以指定附值

LocalTime localTime1 = LocalTime.of(13, 51, 10);
System.out.println(localTime1);

输出如下

image-20200928095322168

获取范围更小的时分秒

//获取小时
        int hour = localTime.getHour();
        int hour1 = localTime.get(ChronoField.HOUR_OF_DAY);
        //获取分
        int minute = localTime.getMinute();
        int minute1 = localTime.get(ChronoField.MINUTE_OF_HOUR);
        //获取秒
        int second = localTime.getSecond();
        int second1 = localTime.get(ChronoField.SECOND_OF_MINUTE);

运行如下

image-20200928095500298

LocalDateTime

如果你全都要,那自然是Date+Time=DateTime了

直接获取

LocalDateTime now = LocalDateTime.now();
System.out.println(now);
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println(now.format(formatter2));

image-20200928095703725

指定时间

LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime localDateTime1 = LocalDateTime.of(2077, Month.SEPTEMBER, 7, 17, 17, 17);
LocalDateTime localDateTime2 = LocalDateTime.of(localDate, localTime);
LocalDateTime localDateTime3 = localDate.atTime(localTime);
LocalDateTime localDateTime4 = localTime.atDate(localDate);
//这里的localTime和localDate拿的是上面定义的

image-20200928100139674

Instant

拿秒

我们最熟悉的不过currentTimeMillis,在计算程序运行时间用的比较多,但在java.time包里给我们准备了Instant类,也能拿秒

// 创建Instant对象
Instant instant = Instant.now();
// 获取秒
long currentSecond = instant.getEpochSecond();
// 获取毫秒
long currentMilli = instant.toEpochMilli();
//常用
long l = System.currentTimeMillis();

输出情况

image-20200928100732870

当然最后这个System类还是牛逼的,毕竟在系统类里。

时间戳

格林威治时间1970年01月01日00时00分00秒到现在的总秒数,共10位,单位为秒

注意:Java生成的时间戳是13位,单位是毫秒

如果还想拿更精确的秒,System里还有一个nanoTime可以用

image-20200928103040777

tips(阿里巴巴开发手册推荐):

在JDK8中,针对统计时间等场景,推荐使用Instant类

修改时间

java.time下的LocalDate、LocalTime、LocalDateTime、Instant类实例的修改方法

我们直接用LocalDate实例点一下发现他里面封装了很多方法

image-20200928101301552

咱这一个一个讲也没必要,大多数都是望文生义,比如plusDays,那自然是在当前日期加天数,得到加完后的日期是哪天

image-20200928101523567

怕了吗,加十天国庆假期直接结束。

还有像什么firstDayOfYear(一年当中第一天是几号)等等不再赘述,另外几个类中也有相似的很多方法。

格式化输出

说道日期的格式化输出,大家第一个想到的肯定是

SimpleDateFormat

他的用法不尽其数,但是只要知道yyyy-dd-mm–hh-mm-ss之间的关系,想怎么输出就怎么输出。

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * <h3>firstIdeaProject</h3>
 * <p></p>
 *
 * @author : Nicer_feng
 * @date : 2020-09-28 10:21
 **/
public class SimpleDateFormatDemo {
    
    
    public static void main(String[] args) {
    
    
        SimpleDateFormat myFmt=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
        SimpleDateFormat myFmt1=new SimpleDateFormat("yy/MM/dd HH:mm");
        SimpleDateFormat myFmt2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //等价于now.toLocaleString()
        SimpleDateFormat myFmt3=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E ");
        SimpleDateFormat myFmt4=new SimpleDateFormat("一年中的第 D 天 一年中第w个星期 一月中第W个星期 在一天中k时 z时区");
        SimpleDateFormat myFmt5=new SimpleDateFormat("今年是yyyy,这个月是MM月了,今天是dd号啊");
        Date now=new Date();
        System.out.println(myFmt.format(now));
        System.out.println(myFmt1.format(now));
        System.out.println(myFmt2.format(now));
        System.out.println(myFmt3.format(now));
        System.out.println(myFmt4.format(now));
        System.out.println(myFmt5.format(now));
        System.out.println(now.toString());
        System.out.println(now.toGMTString());
        System.out.println(now.toLocaleString());
    }
}

注意这里的最后两个方法都已经过时了,输出结果如下

image-20200928103336713

下面总结在SimpleDateFormat中各个字母的意思

SimpleDateFormat函数变量/模式字母

G 年代标志符
y 年
M 月
d 日
h 时 在上午或下午 (1~12)
H 时 在一天中 (0~23)
m 分
s 秒
S 毫秒
E 星期
D 一年中的第几天
F 一月中第几个星期几
w 一年中第几个星期
W 一月中第几个星期
a 上午 / 下午 标记符
k 时 在一天中 (1~24)
K 时 在上午或下午 (0~11)
z 时区

更全的可以见JDK8API中的SimpleDateFormat类

https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

image-20200928110224532

讲了这么多SimpleDateFormat,但其实在JDK8中,是不推荐使用的,为什么,因为SimpleDateFormat是线程不安全的。所以我们在JDK8应用中推荐用Instant代替Date,LocalDateTime带Calendar,DateTimeFormatter代替SimpleDateFormat,官方解释是simple beautiful strong immutable thread-safe。

DateTimeFormatter(重要)

跟上面的SimpleDateFormat函数变量基本无异,写一个简单的demo

LocalDate localDate = LocalDate.now();
        String format1 = localDate.format(DateTimeFormatter.BASIC_ISO_DATE);
        //yyyyMMdd
        String format2 = localDate.format(DateTimeFormatter.ISO_DATE);
        //yyyy-MM-dd
        //2.LocalTime  --> String
        LocalTime localTime = LocalTime.now();
        String format3 = localTime.format(DateTimeFormatter.ISO_TIME);
        //20:19:22.42
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss");
        String format4 = localTime.format(formatter);
        //3.LocalDateTime  --> String
        LocalDateTime localDateTime = LocalDateTime.now();
        DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
        String format5 = localDateTime.format(formatter2);

        System.out.println(format1);
        System.out.println(format2);
        System.out.println(format3);
        System.out.println(format4);
        System.out.println(format5);

输出

image-20200928105612447

这个DateTimeFormatter甚至能按照当地习惯来输出

LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy MMM dd EE HH:mm", Locale.CHINA);
        String format5 = localDateTime.format(formatter2);

输出

image-20200928110004377

但是官方给我们弄得总是不符合我们心里预期,所以这里推荐自己封装DateTimeUtils类来调用

DateTimeUtils封装

DateTimeUtils.java

package TimeUtilssss;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

/**
 * <h3>firstIdeaProject</h3>
 * <p></p>
 *
 * @author : Nicer_feng
 * @date : 2020-09-28 10:48
 **/
public class DateTimeUtils {
    
    
    public static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HHmmss");
    public static final DateTimeFormatter YEAR_MONTH_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM");
    public static final DateTimeFormatter SHORT_DATE_FORMATTER = DateTimeFormatter.ofPattern("yyMMdd");
    public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    public static final DateTimeFormatter SHORT_DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyMMddHHmmss");
    public static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    public static final DateTimeFormatter LONG_DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss SSS");

    /**
     * 返回当前的日期
     */
    public static LocalDate getCurrentLocalDate() {
    
    
        return LocalDate.now();
    }

    /**
     * 返回当前时间
     */
    public static LocalTime getCurrentLocalTime() {
    
    
        return LocalTime.now();
    }

    /**
     * 返回当前日期时间
     */
    public static LocalDateTime getCurrentLocalDateTime() {
    
    
        return LocalDateTime.now();
    }

    /**
     * yyyy-MM-dd
     */
    public static String getCurrentDateStr() {
    
    
        return LocalDate.now().format(DATE_FORMATTER);
    }

    /**
     * yyMMdd
     */
    public static String getCurrentShortDateStr() {
    
    
        return LocalDate.now().format(SHORT_DATE_FORMATTER);
    }

    public static String getCurrentMonthStr() {
    
    
        return LocalDate.now().format(YEAR_MONTH_FORMATTER);
    }

    /**
     * yyyy-MM-dd HH:mm:ss
     */
    public static String getCurrentDateTimeStr() {
    
    
        return LocalDateTime.now().format(DATETIME_FORMATTER);
    }


    public static String getCurrentLongDateTimeStr(){
    
    
        return LocalDateTime.now().format(LONG_DATETIME_FORMATTER);
    }

    /**
     * yyMMddHHmmss
     */
    public static String getCurrentShortDateTimeStr() {
    
    
        return LocalDateTime.now().format(SHORT_DATETIME_FORMATTER);
    }

    /**
     * HHmmss
     */
    public static String getCurrentTimeStr() {
    
    
        return LocalTime.now().format(TIME_FORMATTER);
    }

    public static String getCurrentDateStr(String pattern) {
    
    
        return LocalDate.now().format(DateTimeFormatter.ofPattern(pattern));
    }

    public static String getCurrentDateTimeStr(String pattern) {
    
    
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(pattern));
    }

    public static String getCurrentTimeStr(String pattern) {
    
    
        return LocalTime.now().format(DateTimeFormatter.ofPattern(pattern));
    }

    public static LocalDate parseLocalDate(String dateStr, String pattern) {
    
    
        return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(pattern));
    }

    public static LocalDateTime parseLocalDateTime(String dateTimeStr, String pattern) {
    
    
        return LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ofPattern(pattern));
    }

    public static LocalTime parseLocalTime(String timeStr, String pattern) {
    
    
        return LocalTime.parse(timeStr, DateTimeFormatter.ofPattern(pattern));
    }

    public static String formatLocalDate(LocalDate date, String pattern) {
    
    
        return date.format(DateTimeFormatter.ofPattern(pattern));
    }

    public static String formatLocalDateTime(LocalDateTime datetime, String pattern) {
    
    
        return datetime.format(DateTimeFormatter.ofPattern(pattern));
    }

    public static String formatLocalTime(LocalTime time, String pattern) {
    
    
        return time.format(DateTimeFormatter.ofPattern(pattern));
    }

    public static LocalDate parseLocalDate(String dateStr) {
    
    
        return LocalDate.parse(dateStr, DATE_FORMATTER);
    }

    public static LocalDateTime parseLocalDateTime(String dateTimeStr) {
    
    
        return LocalDateTime.parse(dateTimeStr, DATETIME_FORMATTER);
    }

    public static LocalDateTime parseLongLocalDateTime(String longDateTimeStr){
    
    
        return LocalDateTime.parse(longDateTimeStr, LONG_DATETIME_FORMATTER);
    }

    public static LocalTime parseLocalTime(String timeStr) {
    
    
        return LocalTime.parse(timeStr, TIME_FORMATTER);
    }

    public static String formatLocalDate(LocalDate date) {
    
    
        return date.format(DATE_FORMATTER);
    }

    public static String formatLocalDateTime(LocalDateTime datetime) {
    
    
        return datetime.format(DATETIME_FORMATTER);
    }

    public static String formatLocalTime(LocalTime time) {
    
    
        return time.format(TIME_FORMATTER);
    }

    /**
     * 日期相隔秒
     */
    public static long periodHours(LocalDateTime startDateTime,LocalDateTime endDateTime){
    
    
        return Duration.between(startDateTime, endDateTime).get(ChronoUnit.SECONDS);
    }

    /**
     * 日期相隔天数
     */
    public static long periodDays(LocalDate startDate, LocalDate endDate) {
    
    
        return startDate.until(endDate, ChronoUnit.DAYS);
    }

    /**
     * 日期相隔周数
     */
    public static long periodWeeks(LocalDate startDate, LocalDate endDate) {
    
    
        return startDate.until(endDate, ChronoUnit.WEEKS);
    }

    /**
     * 日期相隔月数
     */
    public static long periodMonths(LocalDate startDate, LocalDate endDate) {
    
    
        return startDate.until(endDate, ChronoUnit.MONTHS);
    }

    /**
     * 日期相隔年数
     */
    public static long periodYears(LocalDate startDate, LocalDate endDate) {
    
    
        return startDate.until(endDate, ChronoUnit.YEARS);
    }

    /**
     * 是否当天
     */
    public static boolean isToday(LocalDate date) {
    
    
        return getCurrentLocalDate().equals(date);
    }
    /**
     * 获取当前毫秒数
     */
    public static Long toEpochMilli(LocalDateTime dateTime) {
    
    
        return dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
    }

    /**
     * 判断是否为闰年
     */
    public static boolean isLeapYear(LocalDate localDate){
    
    
        return localDate.isLeapYear();
    }
}

实例化LocalDate类后直接format调用即可

时间戳格式化

拿到Java中13位时间戳以后,我们可以做啥?

long l = System.currentTimeMillis();
System.out.println(l);
//输出	1601260690773

刚才说正常的时间戳是10位,Java中多的3位是毫秒级别,如果不要毫秒直接输出咋办?当然是丢掉后面3位啦,你可以直接除1000,或者把时间戳转为字符串,只拿前十位

long l = System.currentTimeMillis();
System.out.println(l);
System.out.println(l/1000);
String l1 = (l + "").substring(0, 10);
System.out.println(l1);

image-20200928104100794

咱时间戳也是可以直接用SimpleDateFormat 来格式化的,这里做个示范,其他具体操作可以看上面的

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = format.format(l);
System.out.println(s);

image-20200928104225707

参考资料:

阿里巴巴Java开发手册泰山版

DateTimeUtil工具类来自

https://blog.csdn.net/tanhongwei1994/article/details/86680845

猜你喜欢

转载自blog.csdn.net/weixin_43876186/article/details/108845805