Java日期处理

Java8之前的传统日期API

Date转换成字符串

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

/**
 * @author Pickle
 * @version V1.0
 * @date 2024/3/7 14:43
 */
public class Demo {
    public static void main(String[] args) {
        //创建Date类,构造的时候填入当前的日期
        Date date = new Date();
        System.out.println(date);
        //获得秒
        final long time = date.getTime();
        System.out.println(time);
        //将Date转换成更好识别的日期字符串
        final SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss E a");
        final String format1 = format.format(date);
        System.out.println(format1);
        //将秒转换成更好识别的日期字符串
        final String format2 = format.format(time);
        System.out.println(format2);
    }
}

字符串解析成Date对象

    //将字符串的时间解析成日期对象
    String str = "2024-03-07 15:46:50";
    final SimpleDateFormat format3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try {
        final Date parse = format3.parse(str);
        System.out.println(parse);
    } catch (ParseException e) {
        e.printStackTrace();
    }

Calendar对象

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

/**
 * @author Pickle
 * @version V1.0
 * @date 2024/3/7 14:43
 */


public class Demo {
    public static void main(String[] args) {
        final Calendar calendar  = Calendar.getInstance();
        System.out.println(calendar);
        //输出今天时今年的第几天
        final int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
        System.out.println(dayOfYear);
        //修改年份
        calendar.set(Calendar.YEAR, 2025);
        //获取输出年份
        final int year = calendar.get(Calendar.YEAR);
        System.out.println(year);
    }
}

Java开始新增的日期和时间

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

/**
 * @author Pickle
 * @version V1.0
 * @date 2024/3/7 14:43
 */


public class Demo {
    public static void main(String[] args) {
        final Date date = new Date();
        final int year = date.getYear();
        //1.设计不合理,使用不方便
        System.out.println(year + 1900);    //这里得到的年份还要-1900
        Calendar cal = Calendar.getInstance();
        final int month = cal.get(Calendar.MONTH);  //这里得到月份还要自己记忆Calendar.MONTH
        System.out.println(month);
        //2.传统的日期都是可变的对象,修改后丢失原始的信息
        //3.传统的日期是线程不安全的
    }
}


分类

LocalDate
import java.time.DayOfWeek;
import java.time.LocalDate;

/**
 * @author Pickle
 * @version V1.0
 * @date 2024/3/7 16:42
 */
public class LocalDateDemo {
    public static void main(String[] args) {
        //获取本地日期对象(不可变对象)
        final LocalDate now = LocalDate.now();
        //1.获取对象中的信息
        System.out.println(now);    //2024-03-07
        final int year = now.getYear();
        System.out.println(year);    //2024
        final int month = now.getMonthValue();
        System.out.println(month);  //3
        final int day = now.getDayOfMonth();
        System.out.println(day);  //7
        final int dayOfYear = now.getDayOfYear();
        System.out.println(dayOfYear);//67
        final DayOfWeek dayOfWeek = now.getDayOfWeek();
        System.out.println(dayOfWeek); //THURSDAY
        //2.直接修改某个信息
        final LocalDate now1 = now.withYear(2099);
        final LocalDate now2 = now.withMonth(12);
        System.out.println(now);    //2024-03-07
        System.out.println(now1);   //2099-03-07
        System.out.println(now2);   //2024-12-07

        final LocalDate now3 = now.plusYears(2);    //2026-03-07
        System.out.println(now3);

        final LocalDate now4 = now.minusYears(2);
        System.out.println(now4);                   //2022-03-07

        final LocalDate now5 = LocalDate.of(2008, 12, 12);
        final LocalDate now6 = LocalDate.of(2008, 12, 22);
        System.out.println(now5);   //2008-12-12
        System.out.println(now6);   //2008-12-22

        System.out.println(now5.equals(now6));      //false
        System.out.println(now5.isBefore(now6));    //true
        System.out.println(now5.isAfter(now6));     //false

    }
}

LocalTime

import java.time.LocalTime;
/**
 * @author Pickle
 * @version V1.0
 * @date 2024/3/7 18:38
 */
public class LocalTimeDemo {
    public static void main(String[] args) {
        final LocalTime now = LocalTime.now();
        System.out.println(now);    //18:38:47.606559700

        //1.获取事件中的信息
        System.out.println(now.getHour());      //时
        System.out.println(now.getMinute());    //分
        System.out.println(now.getSecond());    //秒
        System.out.println(now.getNano());      //纳秒

        //2.修改时间 withHour,withMinute,withSecond,withNano

        //3.加时间 plusHours,plusMinutes,plusSecond,plusNanos

        //4.减多少 
        
        //...同LocalDate
    }
}

LocalDateTime

和LocalDate、LocalDateTime类似
但是LocalDateTime可以分成LocalDate和LocalTime,LocalTime和LocalDate也可以合成LocalDateTime

ZonedId和ZonedDateTime

import java.time.Clock;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Set;

/**
 * 时区例子
 * @author Pickle
 * @version V1.0
 * @date 2024/3/7 18:55
 */
public class ZoneIdDemo {
    public static void main(String[] args) {
        //时区
        final ZoneId zoneId = ZoneId.systemDefault();
        System.out.println(zoneId.getId());     //Asia/Shanghai
        System.out.println(zoneId.toString());  //Asia/Shanghai

        final Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
        System.out.println(availableZoneIds);

        final ZoneId zoneId1 = ZoneId.of("America/New_York");
        System.out.println(zoneId1);            //America/

        //ZonedDateTime 带时区的时间
         final ZonedDateTime now = ZonedDateTime.now(zoneId1);
        System.out.println(now);                //2024-03-07T19:46:33.239634900-05:00[America/New_York]

        //世界标准时间
        final ZonedDateTime now1 = ZonedDateTime.now(Clock.systemUTC());
        System.out.println(now1);               //2024-03-08T00:49:46.709918600Z

        //获取系统默认的时间
        final ZonedDateTime now2 = ZonedDateTime.now();
        System.out.println(now2);               //2024-03-08T08:51:05.539210500+08:00[Asia/Shanghai]


    }
}

Instant

import java.time.Instant;

/**
 * @author Pickle
 * @version V1.0
 * @date 2024/3/8 8:56
 */
public class InstantDemo {
    public static void main(String[] args) {
        //创建Instant对象
        Instant now = Instant.now();
        //获取总秒数
        final long epochSecond = now.getEpochSecond();
        System.out.println(epochSecond);    //1709859671
        //不够一秒的纳秒数
        System.out.println(now.getNano());  //194475000
        System.out.println(now);            //2024-03-08T01:01:11.194475Z
        //Instant的作用
        //1、代码的性能分析
        //2、记录用户的操作时间
        //3、Instant可以获得从1970-01-01T00:00:00Z经过的秒数,LocalTime则不能实现这个功能
    }
}

DateTimeFormatter

Java8中DateTimeFormatter用来代替SimpleDateFormat,原因是SimpleDateFormat是线程不安全的

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * @author Pickle
 * @version V1.0
 * @date 2024/3/8 9:08
 */
public class DateTimeFormatterDemo {
    public static void main(String[] args) {
        final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
        final LocalDateTime now = LocalDateTime.now();
        //正向格式化
        System.out.println(dateTimeFormatter.format(now));      //2024年03月08日 09:38:45
        //反向格式化
        final String format = now.format(dateTimeFormatter);
        System.out.println(format);                             //2024年03月08日 09:38:45
        //解析时间
        String dateStr = "2029年12月12日 12:12:11";
        final LocalDateTime parse = LocalDateTime.parse(dateStr, dateTimeFormatter);
        System.out.println(parse);                              //2029-12-12T12:12:11
    }
}

Period

用于计算时间间隔(年月日)

import java.time.LocalDate;
import java.time.Period;

/**
 * @author Pickle
 * @version V1.0
 * @date 2024/3/8 9:49
 */
public class PeriodDemo {
    public static void main(String[] args) {
        final LocalDate start = LocalDate.of(2029, 4, 10);
        final LocalDate end = LocalDate.of(2029, 8, 15);
        final Period period = Period.between(start, end);
        //底层就是年、月、日对应相减
        System.out.println(period.getYears());  //0
        System.out.println(period.getMonths()); //4
        System.out.println(period.getDays());   //5
    }
}

Duration

import java.time.Duration;
import java.time.LocalDateTime;
import java.time.temporal.Temporal;

/**
 * @author Pickle
 * @version V1.0
 * @date 2024/3/8 9:57
 */
public class DurationDemo {
    public static void main(String[] args) {
        //LocalDateTime实现了Temporal接口
        final LocalDateTime start = LocalDateTime.of(2023,12,24,9,0);
        final LocalDateTime end = LocalDateTime.of(2023,12,24,9,3);
        final Duration between = Duration.between(start, end);
        //间隔多少天
        System.out.println(between.toDays());       //0
        //间隔多少小时
        System.out.println(between.toHours());      //0
        //间隔多少分钟
        System.out.println(between.toMinutes());    //3
        //间隔多少秒
        System.out.println(between.toSeconds());    //180
        //间隔多少毫秒
        System.out.println(between.toMillis());     //180000
        //间隔多少纳秒
        System.out.println(between.toNanos());      //180000000000


    }
}

posted @ 2024-03-07 18:50  破忒头头  阅读(35)  评论(0)    收藏  举报