Procesamiento de fecha y hora de Java, necesario para el trabajo (colección recomendada)

En mi trabajo, a menudo me encuentro con empresas que procesan la hora y la fecha. Personalmente, no creo que sea necesario memorizar API como la fecha, y simplemente verificar la información cuando sea necesario. Clasifiqué los métodos de procesamiento de fecha y hora comúnmente utilizados en la clase de fecha antes y después de Java8, para que sea conveniente encontrar cuándo se necesita trabajo y los amigos que lo encuentren útil puedan marcarlo como favorito.

inserte la descripción de la imagen aquí

1. Formato y análisis de fechas

clase java.util.Date

operación de formato

public void oldFormat(){
    
    
    Date now = new Date();
    //format yyyy-MM-dd
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String date  = sdf.format(now);
    System.out.println(String.format("date format : %s", date));

    //format HH:mm:ss
    SimpleDateFormat sdft = new SimpleDateFormat("HH:mm:ss");
    String time = sdft.format(now);
    System.out.println(String.format("time format : %s", time));

    //format yyyy-MM-dd HH:mm:ss
    SimpleDateFormat sdfdt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String datetime = sdfdt.format(now);
    System.out.println(String.format("dateTime format : %s", datetime));
}

Análisis: formato de cadena a fecha

//已弃用
Date date = new Date("2021-01-26");
//替换为
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf.parse("2021-01-26");

Clases LocalDate, LocalTime, LocalDateTIme

formato:

public void newFormat(){
    
    
    //format yyyy-MM-dd
    LocalDate date = LocalDate.now();
    System.out.println(String.format("date format : %s", date));

    //format HH:mm:ss
    LocalTime time = LocalTime.now().withNano(0);
    System.out.println(String.format("time format : %s", time));

    //format yyyy-MM-dd HH:mm:ss
    LocalDateTime dateTime = LocalDateTime.now();
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    String dateTimeStr = dateTime.format(dateTimeFormatter);
    System.out.println(String.format("dateTime format : %s", dateTimeStr));
}

Análisis: formato de cadena a fecha

LocalDate date = LocalDate.of(2021, 1, 26);
// 或
LocalDate date1 = LocalDate.parse("2021-01-26");
System.out.println(date);

LocalDateTime dateTime = LocalDateTime.of(2021, 1, 26, 12, 12, 22);
// 或
LocalDateTime dateTime1 = LocalDateTime.parse("2021-01-26T12:12:22");
System.out.println(dateTime);

LocalTime time = LocalTime.of(12, 12, 22);
// 或
LocalTime time1 = LocalTime.parse("12:12:22");
System.out.println(time);

2. Conversión de objeto de fecha

Fecha a la clase LocalDate

Si desea convertir java.util.Date a java.time.LocalDate, puede seguir los siguientes pasos:

1) Convierta java.util.Date a ZonedDateTime.

2) Obtenga LocalDate de ZonedDateTime usando su método toLocalDate().

Date date = new Date();
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();

// atZone()方法返回在指定时区从此Instant生成的ZonedDateTime。
LocalDate localDate = instant.atZone(zoneId).toLocalDate();
System.out.println("Date = " + date);
System.out.println("LocalDate = " + localDate);

Clase LocalDate to Date

Si desea convertir LocalDate nuevamente a java.util.Date, puede seguir los siguientes pasos:

1) Convierta LocalDate a Instantáneo usando ZonedDateTime.

2) Utilice el método from() para obtener la instancia de Fecha del objeto Instantáneo

ZoneId zoneId = ZoneId.systemDefault();
LocalDate localDate = LocalDate.now();
ZonedDateTime zdt = localDate.atStartOfDay(zoneId);

Date date = Date.from(zdt.toInstant());

System.out.println("LocalDate = " + localDate);
System.out.println("Date = " + date);

3. Cálculo del intervalo de fechas

clase java.util.Date

 //算两个日期间隔多少天,计算间隔多少年,多少月方法类似
 String dates1 = "2022-08-23";
 String dates2 = "2022-02-26";
 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
 Date date1 = format.parse(dates1);
 Date date2 = format.parse(dates2);
 int day = (int) ((date1.getTime() - date2.getTime()) / (1000 * 3600 * 24));
 System.out.println(dates1 + "和" + dates2 + "相差" + day + "天");
 //结果:2022-08-23和2022-02-26相差178天

java.time.LocalDate

//算两个日期间隔多少天,计算间隔多少年,多少月
LocalDate date1 = LocalDate.parse("2022-08-23");
LocalDate date2 = LocalDate.parse("2022-02-26");
Period period = Period.between(date1, date2);
System.out.println("date1 到 date2 相隔:"
        + period.getYears() + "年"
        + period.getMonths() + "月"
        + period.getDays() + "天");
//打印结果是date1 到 date2 相隔:0年-5月-25天
//这里period.getDays()得到的天是抛去年月以外的天数,并不是总天数

//如果要获取纯粹的总天数应该用下面的方法,toEpochDay返回距离1970年1月1日的天数的long值
long day = date1.toEpochDay() - date2.toEpochDay();
System.out.println(date1 + "和" + date2 + "相差" + day + "天");
//打印结果:2022-08-23和2022-02-26相差178天

Se introdujeron dos nuevas clases relacionadas con fechas en Java 8:

  • Periodo - clase para calcular el intervalo entre dos "fechas"
  • Duración - clase para calcular el intervalo de dos "tiempos"

La clase Period y la clase Duration son conceptos de duración. Si necesita comparar el tiempo, necesitan un valor de tiempo fijo, por lo que necesita la clase LocalDate y las clases Instant, LocalTime y LocalDateTime para trabajar con ellas:

El período corresponde a LocalDate y sus alcances son todas las fechas (año/mes/día).
La duración corresponde a Instant, LocalTime, LocalDateTime y sus alcances son todos los tiempos (días/horas/minutos/segundos/milisegundos/nanosegundos).

Duración API común:

inserte la descripción de la imagen aquí

LocalDateTime start = LocalDateTime.parse("2022-12-03T10:15:30");
LocalDateTime end = LocalDateTime.parse("2023-12-01T10:25:33");

//between的用法是end-start的时间,若start的时间大于end的时间,则所有的值是负的
Duration duration = Duration.between(start, end);

String timeString = duration.toString(); //此持续时间的字符串表示形式,使用基于ISO-8601秒*的表示形式,例如 PT8H6M12.345S
System.out.println("相差的天数="+duration.toDays());
System.out.println("相差的小时="+ duration.toHours());
System.out.println("相差的分钟="+duration.toMinutes());
System.out.println("相差的毫秒="+duration.toMillis());
System.out.println("相差的纳秒="+duration.toNanos());
System.out.println("timeString时间="+timeString);

//isNegative返回Duration实例对象是否为负
System.out.println(Duration.between(start, end).isNegative());//false  end-start为正,所以此处返回false
System.out.println(Duration.between(end, start).isNegative());//true   start-end为负,所以此处返回true
System.out.println(Duration.between(start, start).isNegative());//false start-start为0,所以此处为false

执行结果:
相差的天数=363
相差的小时=8712
相差的分钟=522730
相差的毫秒=31363803000
相差的纳秒=31363803000000000
timeString时间=PT8712H10M3S
false
true
false

API comunes del período:

inserte la descripción de la imagen aquí

LocalDate start = LocalDate.of(2022,12,3);
LocalDate end = LocalDate.of(2023,12,1);
Period period = Period.between(start,end);
System.out.println("两个时间之间的差值  年:"+period.getYears()+",月:"+period.getMonths()+",日:"+period.getDays());

结果:
两个时间之间的差值  年:0,月:11,日:28

ChronoUnit también puede calcular el número de días, meses o años entre dos unidades.

LocalDate start = LocalDate.of(2022,12,3);
LocalDate end = LocalDate.of(2023,12,1);
long day = ChronoUnit.DAYS.between(start , end );
System.out.println("相差天数:" + day);
long month= ChronoUnit.MONTHS.between(start , end );
System.out.println("相差月数:" + month);
long year= ChronoUnit.YEARS.between(start , end );
System.out.println("相差年数:" + year);

// 结果:
相差天数:363
相差月数:11
相差年数:0

4. Obtenga la fecha especificada

clase java.util.Date

Lo siguiente es sólo un ejemplo de algunas fechas, y otras unidades (año, mes, día, 1/2 día, hora, etc.) son similares.

//一周后的日期
SimpleDateFormat formatDate = new SimpleDateFormat("yyyy-MM-dd");
Calendar ca = Calendar.getInstance();
ca.add(Calendar.DATE, 7);
Date d = ca.getTime();
String after = formatDate.format(d);
System.out.println("当前日期:" + formatDate.format(new Date()));
System.out.println("一周后日期:" + after);
//当前日期:2023-08-26
//一周后日期:2023-09-02

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
//获取当前月第一天:
Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_MONTH, 1);
String first = format.format(c.getTime());
System.out.println("first day:" + first);

//获取当前月最后一天
Calendar ca = Calendar.getInstance();
ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
String last = format.format(ca.getTime());
System.out.println("last day:" + last);

//当年最后一天
Calendar currCal = Calendar.getInstance();
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.YEAR, currCal.get(Calendar.YEAR));
calendar.roll(Calendar.DAY_OF_YEAR, -1);
Date time = calendar.getTime();
System.out.println("last day:" + format.format(time));

//first day:2023-08-01
//last day:2023-08-31
//last day:2023-12-31

java.time.LocalDate

Lo siguiente es sólo un ejemplo de algunas fechas, y otras unidades (año, mes, día, 1/2 día, hora, etc.) son similares. Además, estas unidades se definen en la enumeración java.time.temporal.ChronoUnit.

//一周后的日期
LocalDate localDate = LocalDate.now();
//方法1
LocalDate after = localDate.plus(1, ChronoUnit.WEEKS);
//方法2
LocalDate after2 = localDate.plusWeeks(1);
System.out.println("一周后日期:" + after);
System.out.println("一周后日期:" + after2);
//一周后日期:2023-09-02
//一周后日期:2023-09-02

LocalDate today = LocalDate.now();
//获取当前月第一天:
LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth());
// 取本月最后一天
LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth());
//取下一天:
LocalDate nextDay = lastDayOfThisMonth.plusDays(1);
//当年最后一天
LocalDate lastDay = today.with(TemporalAdjusters.lastDayOfYear());
//2023年最后一个周日
LocalDate lastMondayOf2021 = LocalDate.parse("2023-12-31").with(TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY));

Cinco, zona horaria

clase java.util.Date

El objeto java.util.Date esencialmente almacena el número de milisegundos transcurridos desde las 0:00 (GMT) del 1 de enero de 1970 hasta el momento representado por el objeto Date. Es decir, no importa en qué zona horaria se encuentre la nueva fecha, la cantidad de milisegundos que registra es la misma, independientemente de la zona horaria. Pero debería convertirse a la hora local en uso, lo que implica la internacionalización de la hora.
java.util.Date en sí no admite la internacionalización, necesita TimeZone.

// 北京时间:Sat Aug 26 14:52:29 CST 2023
Date date = new Date();

SimpleDateFormat bjSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 北京时区
bjSdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
System.out.println("毫秒数:" + date.getTime() + ", 北京时间:" + bjSdf.format(date));
// 东京时区
SimpleDateFormat tokyoSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
tokyoSdf.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));  // 设置东京时区
System.out.println("毫秒数:" + date.getTime() + ", 东京时间:" + tokyoSdf.format(date));
// 如果直接print会自动转成当前时区的时间
System.out.println(date);

//毫秒数:1693032749431, 北京时间:2023-08-26 14:52:29
//毫秒数:1693032749431, 东京时间:2023-08-26 15:52:29
//Sat Aug 26 14:52:29 CST 2023

Clase ZonedDateTime

Java8 introdujo java.time.ZonedDateTime para representar la hora con la zona horaria. Puede verse como LocalDateTime + ZoneId.

//当前时区时间
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println("当前时区时间: " + zonedDateTime);

//东京时间
ZoneId zoneId = ZoneId.of(ZoneId.SHORT_IDS.get("JST"));
ZonedDateTime tokyoTime = zonedDateTime.withZoneSameInstant(zoneId);
System.out.println("东京时间: " + tokyoTime);

// ZonedDateTime 转 LocalDateTime
LocalDateTime localDateTime = tokyoTime.toLocalDateTime();
System.out.println("东京时间转当地时间: " + localDateTime);

//LocalDateTime 转 ZonedDateTime
ZonedDateTime localZoned = localDateTime.atZone(ZoneId.systemDefault());
System.out.println("本地时区时间: " + localZoned);

当前时区时间: 2023-08-26T14:55:47.669+08:00[Asia/Shanghai]
东京时间: 2023-08-26T15:55:47.669+09:00[Asia/Tokyo]
东京时间转当地时间: 2023-08-26T15:55:47.669
本地时区时间: 2023-08-26T15:55:47.669+08:00[Asia/Shanghai]

La API de uso común se seguirá agregando más adelante. . .

Bueno, a los amigos que les resulte útil aquí les debería gustar, el blogger todavía está muy cansado de ordenar la información y necesita comentarios positivos.
inserte la descripción de la imagen aquí

おすすめ

転載: blog.csdn.net/weixin_44863237/article/details/132510015