Fundamentos de Java (04): explicación detallada del uso de la API de fecha y hora

Código fuente de este artículo: GitHub · haga clic aquí || GitEE · haga clic aquí

1. Hora y fecha

En el desarrollo de sistemas, la fecha y la hora son factores comerciales importantes y juegan un papel muy crítico. Por ejemplo, generación de datos bajo el mismo nodo de tiempo, varias estadísticas y análisis de datos basados ​​en rango de tiempo, tiempo unificado de nodos de clúster para evitar tiempos de espera, etc.

Hay varios conceptos clave en fecha y hora:

  • Fecha: por lo general, la combinación de año, mes y día representa la fecha actual.
  • Hora: por lo general, la combinación de horas, minutos y segundos representa la hora actual.
  • Zona horaria: los países y regiones del mundo tienen diferentes longitudes, están divididos en 24 zonas horarias estándar y la diferencia horaria entre zonas horarias adyacentes es de una hora.
  • Marca de tiempo: 1970-1-1 00:00:00el número total de segundos desde la hora UTC hasta el presente.

El uso de la fecha y la hora en el sistema suele ser para obtener la hora y algunos cálculos comunes y el procesamiento de conversión de formato, que se volverá mucho más complicado en algunos negocios con zonas horarias, como el comercio global o las compras en el extranjero en negocios de comercio electrónico. .

2. API nativa de JDK

1. Conceptos básicos de la fecha

Uso básico

java.sql.Date hereda java.util.Date y la mayoría de los métodos relacionados llaman directamente a los métodos principales.

public class DateTime01 {
    
    
    public static void main(String[] args) {
    
    
        long nowTime = System.currentTimeMillis() ;
        java.util.Date data01 = new java.util.Date(nowTime);
        java.sql.Date date02 = new java.sql.Date(nowTime);
        System.out.println(data01);
        System.out.println(date02.getTime());
    }
}
打印:
Fri Jan 29 15:11:25 CST 2021
1611904285848

Reglas de cálculo

public class DateTime02 {
    
    
    public static void main(String[] args) {
    
    
        Date nowDate = new Date();
        System.out.println("年:"+nowDate.getYear());
        System.out.println("月:"+nowDate.getMonth());
        System.out.println("日:"+nowDate.getDay());
    }
}

Año: hora actual menos 1900;

public int getYear() {
    
    
    return normalize().getYear() - 1900;
}

Mes: 0-11 significa 1-12 meses;

public int getMonth() {
    
    
    return normalize().getMonth() - 1;
}

Talento: expresión normal;

public int getDay() {
    
    
    return normalize().getDayOfWeek() - BaseCalendar.SUNDAY;
}

Conversión de formato

API de conversión de fecha no segura para subprocesos, este uso no está permitido en el desarrollo de la especificación.

public class DateTime02 {
    
    
    public static void main(String[] args) throws Exception {
    
    
        // 默认转换
        DateFormat dateFormat01 = new SimpleDateFormat() ;
        String nowDate01 = dateFormat01.format(new Date()) ;
        System.out.println("nowDate01="+nowDate01);
        // 指定格式转换
        String format = "yyyy-MM-dd HH:mm:ss";
        SimpleDateFormat dateFormat02 = new SimpleDateFormat(format);
        String nowDate02 = dateFormat02.format(new Date()) ;
        System.out.println("nowDate02="+nowDate02);
        // 解析时间
        String parse = "yyyy-MM-dd HH:mm";
        SimpleDateFormat dateFormat03 = new SimpleDateFormat(parse);
        Date parseDate = dateFormat03.parse("2021-01-18 16:59:59") ;
        System.out.println("parseDate="+parseDate);
    }
}

Como fecha y hora utilizadas en la versión inicial del JDK, la clase Date se ha utilizado en el proyecto, pero los métodos API relacionados se han abandonado básicamente, por lo general utilizando algunos componentes de tiempo de empaquetado secundarios. El diseño de esta API es el peor de Java.

2. Actualización de calendario

Como clase abstracta, Calendar define los métodos de cálculo y conversión relacionados con la fecha y la hora. Esta clase se inspecciona visualmente

public class DateTime04 {
    
    
    public static void main(String[] args) {
    
    
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR,2021);
        calendar.set(Calendar.MONTH,1);
        calendar.set(Calendar.DAY_OF_MONTH,12);
        calendar.set(Calendar.HOUR_OF_DAY,23);
        calendar.set(Calendar.MINUTE,59);
        calendar.set(Calendar.SECOND,59);
        calendar.set(Calendar.MILLISECOND,0);
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
        Date defDate = calendar.getTime();
        System.out.println(defDate+"||"+dateFormat.format(defDate));
    }
}
输出:Fri Feb 12 23:59:59 CST 2021||2021-02-12 23:59:59

Intuitivamente, los métodos relacionados en Date se implementan migrando Calendar, simplificando la función de Date se enfoca en el empaquetado de entidades de fecha y hora, Calendar es complejo relacionado con las estrategias de cálculo y DateFormat todavía se usa para el procesamiento de formato. Sin embargo, Calendar todavía se usa raramente, y la API básica mencionada anteriormente ya es una buena descripción.

3. API de actualización JDK1.8

En versiones posteriores a Java 8, las clases de API principales incluyen LocalDate-date, LocalTime-time y LocalDateTime-date más hora.

  • LocalDate: la descripción de la fecha es una clase inmutable modificada final, el formato predeterminado es aaaa-MM-dd.
  • LocalTime: la descripción de tiempo es una clase inmutable con modificación final, el formato predeterminado es hh: mm: ss.zzz.
  • LocalDateTime: la clase inmutable que describe la modificación final de la fecha y la hora.
public class DateTime05 {
    
    
    public static void main(String[] args) {
    
    
        // 日期:年-月-日
        System.out.println(LocalDate.now());
        // 时间:时-分-秒-毫秒
        System.out.println(LocalTime.now());
        // 日期时间:年-月-日 时-分-秒-毫秒
        System.out.println(LocalDateTime.now());
        // 日期节点获取
        LocalDate localDate = LocalDate.now();
        System.out.println("[" + localDate.getYear() +
                "年];[" + localDate.getMonthValue() +
                "月];[" + localDate.getDayOfMonth()+"日]");
        // 计算方法
        System.out.println("1年后:" + localDate.plusYears(1));
        System.out.println("2月前:" + localDate.minusMonths(2));
        System.out.println("3周后:" + localDate.plusWeeks(3));
        System.out.println("3天前:" + localDate.minusDays(3));

        // 时间比较
        LocalTime localTime1 = LocalTime.of(12, 45, 45); ;
        LocalTime localTime2 = LocalTime.of(16, 30, 30); ;
        System.out.println(localTime1.isAfter(localTime2));
        System.out.println(localTime2.isAfter(localTime1));
        System.out.println(localTime2.equals(localTime1));

        // 日期和时间格式
        LocalDateTime localDateTime = LocalDateTime.now() ;
        LocalDate myLocalDate = localDateTime.toLocalDate();
        LocalTime myLocalTime = localDateTime.toLocalTime();
        System.out.println("日期:" + myLocalDate);
        System.out.println("时间:" + myLocalTime);
    }
}

Si eres un usuario profundo de los componentes de JodaTime, básicamente no hay presión para usar estas API.

4. Marca de tiempo

La marca de tiempo también es un método comúnmente utilizado en los negocios, basado en el tipo Long para expresar la hora, en muchos casos mucho mejor que el formato convencional de fecha y hora.

public class DateTime06 {
    
    
    public static void main(String[] args) {
    
    
        // 精确到毫秒级别
        System.out.println(System.currentTimeMillis());
        System.out.println(new Date().getTime());
        System.out.println(Calendar.getInstance().getTime().getTime());
        System.out.println(LocalDateTime.now().toInstant(
                ZoneOffset.of("+8")).toEpochMilli());
    }
}

Cabe señalar aquí que hay varias formas de obtener marcas de tiempo en el negocio real, por lo que se recomienda unificar las herramientas y métodos, y especificar la precisión, para evitar el problema de la precisión de la parte al segundo y la parte exacta al milisegundo. para evitar la conversión mutua durante el uso.

Tres componentes de JodaTime

Antes de Java8, el componente JodaTime era una opción común en la mayoría de los sistemas, y había muchos métodos de procesamiento de fecha y hora convenientes y fáciles de usar encapsulados.

Dependencia básica:

<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
</dependency>

Realice un encapsulado de clase de herramienta simple sobre los componentes proporcionados por joda-time para garantizar un estilo de procesamiento comercial uniforme.

public class JodaTimeUtil {
    
    

    // 时间格式
    public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

    private JodaTimeUtil (){
    
    }

    // 获取当前时间
    public static DateTime getCurrentTime (){
    
    
        return new DateTime() ;
    }

    // 获取指定时间
    public static DateTime getDateTime (Object obj){
    
    
        return new DateTime(obj) ;
    }

    // 把时间以指定格式转换为字符串
    public static String getNowDate (Date date, String format){
    
    
        return new DateTime(date).toString(format) ;
    }

    // 获取星期时间
    public static String getWeek (Object date){
    
    
        DateTime time = getDateTime (date) ;
        String week = null ;
        switch (time.getDayOfWeek()) {
    
    
            case DateTimeConstants.SUNDAY:
                week = "星期日";
                break;
            case DateTimeConstants.MONDAY:
                week = "星期一";
                break;
            case DateTimeConstants.TUESDAY:
                week = "星期二";
                break;
            case DateTimeConstants.WEDNESDAY:
                week = "星期三";
                break;
            case DateTimeConstants.THURSDAY:
                week = "星期四";
                break;
            case DateTimeConstants.FRIDAY:
                week = "星期五";
                break;
            case DateTimeConstants.SATURDAY:
                week = "星期六";
                break;
            default:
                break;
        }
        return week ;
    }
}

Cuarto, la dirección del código fuente

GitHub·地址
https://github.com/cicadasmile/java-base-parent
GitEE·地址
https://gitee.com/cicadasmile/java-base-parent

Leer la etiqueta

[ Fundamentos de Java ] [ Modo de diseño ] [ Estructuras y algoritmos ] [ Sistema Linux ] [ base de datos ]

[ arquitectura distribuida ] [ microservicio ] [ componentes de big data ] [ SpringBoot Advanced ] [ Fundamentos de Spring & Boot ]

[ análisis de datos ] [ Pautas técnicas Imagen ] [ Lugar de trabajo ]

Supongo que te gusta

Origin blog.csdn.net/cicada_smile/article/details/113853741
Recomendado
Clasificación