jdk8 obtener la hora actual | suma y resta de tiempo | formato de hora java8 | herramienta de procesamiento de tiempo | comparación de tiempo | método de procesamiento de tiempo seguro para subprocesos

Tabla de contenido

Prefacio

1. La diferencia entre jdk8 y jdk7 y la clase de procesamiento de fecha y hora anterior:

Dos, clase de fecha / hora de Java 8

Tres: la relación entre la fecha y la hora de la categoría principal (se actualizará)

Cuatro: operación y procesamiento de fechas

Obtenga la fecha actual (solo precisa por año, mes y día)

Obtener la hora actual (puede tener una precisión de milisegundos)

Obtener la fecha del último lunes

Obtener año, mes, día, hora, minuto, segundo específicos

Especificar fecha y hora

Determina si dos fechas son iguales

Calcule las fechas en algunos años (antes), meses (antes), días (antes), etc.

Determine cuántos días hay en un mes específico

Calcule la cantidad de meses, días y minutos entre dos fechas


Prefacio

Hace mucho tiempo, resumí algunos de los métodos públicos de procesamiento de tiempo antes de la versión jdk7, como convertir fechas en cadenas, especificar la hora más la fecha después del número de días especificado, obtener la hora del lunes de la semana anterior, etc .; puede hacer clic en el enlace para ver los detalles. Completo: https://blog.csdn.net/qq_27471405/article/details/79523556

Pero estos no son seguros para subprocesos y no se recomiendan, por ejemplo

En una clase, existe el siguiente código:
private static SimpleDateFormat sdf = new SimpleDateFormat ("aaaa-MM-dd HH: mm: ss");
public String getDate (Date date) { return sdf.format (date); }

El código anterior no es seguro para subprocesos cuando es simultáneo. Puede buscar detalles específicos. No hablaré de ello aquí.

Así que hoy compartiré con ustedes algunos métodos públicos de procesamiento de tiempo después de jdk8, que son seguros para subprocesos, y debe usar los siguientes métodos en el futuro

 

1. La diferencia entre jdk8 y jdk7 y la clase de procesamiento de fecha y hora anterior:


1. Las clases java.util.Date y java.util.Calendar de Java no son fáciles de usar, no admiten zonas horarias y son variables, lo que significa que no son seguras para subprocesos;
2. Clases para formatear fechas DateFormat se coloca en el paquete java.text, es una clase abstracta, por lo que necesitamos crear una instancia de un objeto SimpleDateFormat para manejar el formato de fecha, y DateFormat tampoco es seguro para subprocesos, lo que significa que si llama al mismo en un programa de subprocesos múltiples Objeto DateFormat, obtendrá resultados inesperados.
3. El cálculo de la fecha es engorroso y propenso a errores, porque el mes comienza desde 0, lo que significa que el mes obtenido del Calendario debe aumentarse en uno para representar el mes actual.
Debido a los problemas anteriores, ha habido algunos marcos de procesamiento de fechas tripartitos. , Como Joda-Time, data4j y otros proyectos de código abierto


Dos, clase de fecha / hora de Java 8


Las clases de fecha y hora de Java 8 incluyen LocalDate, LocalTime, Instant, Duration y Period. Estas clases están incluidas en el paquete java.time.

  • Instantáneo: instancia instantánea.

  • LocalDate: fecha local, excluyendo la hora específica. Por ejemplo: 2014-01-14 puede usarse para registrar cumpleaños, aniversarios, días de unión, etc.

  • LocalTime: hora local, excluida la fecha.

  • LocalDateTime: una combinación de fecha y hora, pero no incluye información sobre la diferencia horaria y la zona horaria.

  • ZonedDateTime: La fecha y hora más completas, incluida la zona horaria y la diferencia horaria con respecto a UTC o Greenwich.

La nueva API también presenta las clases ZoneOffSet y ZoneId, lo que facilita la resolución del problema de la zona horaria. La clase DateTimeFormatter para analizar y formatear la hora también se ha rediseñado por completo.

 

Tres: la relación entre la fecha y la hora de la categoría principal (se actualizará)

 

1. El diagrama de relaciones de LocalDate:

2 、 LocalTime :

3 、 LocalDateTime :

4 、 OffsetTime :

5 、 OffsetDateTime :

6 、 ZonedDateTime :

7 、 Instantáneo :

 

Cuatro: operación y procesamiento de fechas

 

Obtenga la fecha actual (solo precisa por año, mes y día)

/**
     * 获取当前日期(只能精确到年月日)
     * @param formatStr
     */
    public static void getNowDate(String formatStr){
        if (StringUtils.isBlank(formatStr)){
            formatStr = "yyyy-MM-dd";
        }
        LocalDate now = LocalDate.now();
        System.out.println("当前日期: " + now + " " + now.getDayOfWeek());
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatStr);                        // * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023   * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
        String nowFormat = now.format(dateTimeFormatter);
        System.out.println("格式化后的当前日期:"+nowFormat);
    }

Si tiene el formato de días, horas y segundos, se informará una excepción: Excepción en el hilo "principal" java.time.temporal.UnsupportedTemporalTypeException: Campo no admitido: HourOfDay

 

Obtener la hora actual (puede tener una precisión de milisegundos)

 /**
     * 获取当前时间(可以精确到毫秒)
     * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023
     * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
     * @param formatStr
     */
    public static void getNowTime(String formatStr){
        if (StringUtils.isBlank(formatStr)){
            formatStr = "yyyy-MM-dd";
        }
        LocalDateTime now = LocalDateTime.now();
        System.out.println("当前日期: " + now + " " + now.getDayOfWeek());
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatStr);                      // * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023    * 其他均为盗版,公众号:灵儿的笔记(zygxsq)

        String nowFormat = now.format(dateTimeFormatter);
        System.out.println("格式化后的当前日期:"+nowFormat);

    }

 

Obtener la fecha del último lunes

/**
     * 获取上周周一的日期
     * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023
     * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
     */
    public static void getLastMonday(){
        LocalDate now = LocalDate.now();
        System.out.println("当前日期: " + now + " " + now.getDayOfWeek());
        LocalDate todayOfLastWeek = now.minusDays(7);
        LocalDate last_monday = todayOfLastWeek.with(TemporalAdjusters.previous(DayOfWeek.SUNDAY)).plusDays(1); // * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023   * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
        System.out.println("上周周一日期:"+last_monday); 
    }

 

Obtener año, mes, día, hora, minuto, segundo específicos

/**
     * 获取具体年、月、日、小时、分钟、秒
     * @param formatStr
     */
    public static void getDetailTime(String formatStr){
        LocalDateTime now = LocalDateTime.now();
        System.out.println("当前日期: " + now + " " + now.getDayOfWeek());
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatStr);

        String nowFormat = now.format(dateTimeFormatter);
        System.out.println("格式化后的当前日期:"+nowFormat);

        int year = now.getYear();
        int month = now.getMonthValue();
        int day = now.getDayOfMonth();
        int hour = now.getHour();
        int minute = now.getMinute();
        int second = now.getSecond();
        int nano = now.getNano();
        
        System.out.printf("年 : %d  月 : %d  日 : %d  小时:%d 分钟:%d 秒:%d  毫秒:%d %n", year, month, day,hour,minute,second,nano);  // * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023   * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
    }

 

Especificar fecha y hora

/**
     * 指定日期、时间
     * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023
     * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
     * @param formatStr
     */
    public static void createTime(String formatStr){
        LocalDate date = LocalDate.of(2020, 04, 27);
        System.out.println("指定日期: " + date);
        LocalDateTime time = LocalDateTime.of(2020, 04, 27,06,10,50);
        System.out.println("指定时间: " + time);

        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatStr);
        String nowFormat = time.format(dateTimeFormatter);
        System.out.println("格式化后的指定时间:"+nowFormat);
    }

 

Determina si dos fechas son iguales

/**
     * 判断两个日期是否相等、之前、之后
     * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023
     * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
     */
    public static void compareDate(){
        LocalDate now = LocalDate.now();
        System.out.println("当前时间: " + now + " " + now.getDayOfWeek());
        LocalDate date1 = LocalDate.of(2020, 04, 27);
        LocalDate date2 = LocalDate.of(2020, 04, 27);
        LocalDate date3 = LocalDate.of(2020, 04, 28);

        boolean equal = now.isEqual(date1);
        System.out.printf("是否是同一时间:%s ", date1.equals(now));
        System.out.printf("是否是同一时间:%s ", now.isEqual(date1));

        System.out.println();
        System.out.printf("是否是同一时间:%s ", date1.equals(date2));
        System.out.printf("是否是同一时间:%s ", date1.isEqual(date2));
        System.out.println();
        System.out.println("data2(2020.4.27)是否比data3(2020.4.28)小: "+date2.isBefore(date3));             * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023   * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
        System.out.println("data2(2020.4.27)是否比data3(2020.4.28)大: "+date2.isAfter(date3));
    }

 

Calcule las fechas en algunos años (antes), meses (antes), días (antes), etc.

/**
     * 计算几年后(前)、几月后(前)、几天后(前)等的日期
     * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023
     * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
     * @param formatStr
     */
    public static void calculateTime(String formatStr){
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime newTime = now.plusHours(6);

        System.out.println("当前时间: " + now + " " + now.getDayOfWeek());
        System.out.println("6小时后的时间: " +  newTime);
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatStr);
        String nowFormat = now.format(dateTimeFormatter);
        String newFormat = newTime.format(dateTimeFormatter);
        System.out.println("格式化后的当前时间:"+nowFormat);
        System.out.println("格式化后的6小时后的时间:"+newFormat);

        LocalDateTime twoYearsLater = now.plusYears(2);
        String twoYearsFormat = twoYearsLater.format(dateTimeFormatter);
        System.out.println("2年后的时间:"+twoYearsFormat);

        LocalDateTime twoMonthsLater = now.plusMonths(2);
        String twoMonthsFormat = twoMonthsLater.format(dateTimeFormatter);
        System.out.println("2个月后的时间:"+twoMonthsFormat);

        LocalDateTime twoWeeksLater = now.plusWeeks(2);
        String twoWeeksFormat = twoWeeksLater.format(dateTimeFormatter);
        System.out.println("2周后的时间:"+twoWeeksFormat);

        LocalDateTime twoDaysLater = now.plusDays(2);
        String twoDaysFormat = twoDaysLater.format(dateTimeFormatter);
        System.out.println("2天后的时间:"+twoDaysFormat);

        LocalDateTime twoMinutesLater = now.plusMinutes(2);
        String twoMinutesFormat = twoMinutesLater.format(dateTimeFormatter);
        System.out.println("2分钟后的时间:"+twoMinutesFormat);

        LocalDateTime twoMinutesBefore = now.plusMinutes(-2);
        String twoMinutesBeforeFormat = twoMinutesBefore.format(dateTimeFormatter);
        System.out.println("2分钟前的时间:"+twoMinutesBeforeFormat);

        //原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023
        //其他均为盗版,公众号:灵儿的笔记(zygxsq)
        //还可以直接通过plus方法计算 几年(月周天)后
        LocalDateTime twoYearsPlusLater = now.plus(2, ChronoUnit.YEARS);
        String twoYearsPlusLaterFormat = twoYearsPlusLater.format(dateTimeFormatter);
        System.out.println("2年后的时间:"+twoYearsPlusLaterFormat);

        //负号表示 之前
        LocalDateTime twoDaysPlusBefore = now.plus(-2, ChronoUnit.DAYS);
        String twoDaysPlusBeforeFormat = twoDaysPlusBefore.format(dateTimeFormatter);
        System.out.println("2天前的时间:"+twoDaysPlusBeforeFormat);
        //也可以用minus,也表示之前
        LocalDateTime twoDaysMinusBefore = now.minus(2, ChronoUnit.DAYS);
        String twoDaysMinusBeforeFormat = twoDaysMinusBefore.format(dateTimeFormatter);
        System.out.println("2天前的时间:"+twoDaysMinusBeforeFormat);
    }

 

Determine cuántos días hay en un mes específico

 /**
     * 判断指定月份有多少天
     */
    public static void getMonthDays(){
        YearMonth currentYearMonth = YearMonth.now();
        System.out.println("当前时间:"+currentYearMonth);
        System.out.println("当前月份有多少天:"+currentYearMonth.lengthOfMonth());

        YearMonth february = YearMonth.of(2020, Month.FEBRUARY);
        System.out.println("指定时间的月份2月:"+february);
        System.out.println("指定时间的月份2月有多少天:"+february.lengthOfMonth());
        
    }

 

Calcule la cantidad de meses, días y minutos entre dos fechas

/**
     * 计算两个日期之间相差月数、天数、分钟数
     * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023
     * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
     */
    public static void getDaysBetweenTwoDate(){
        LocalDate startDate = LocalDate.of(2020, 04, 27);
        LocalDate endDate = LocalDate.of(2020, 07, 2);

        long months = startDate.until(endDate, ChronoUnit.MONTHS);
        long days = startDate.until(endDate, ChronoUnit.DAYS);
        System.out.println("startDate(2020.04.27)和endDate(2020.07.02)相差月数:"+months);
        System.out.println("startDate(2020.04.27)和endDate(2020.07.02)相差天数:"+days);

        LocalDateTime startTime = LocalDateTime.of(2020, 04, 27,18,20,10);
        LocalDateTime endTime = LocalDateTime.of(2020, 04, 27,18,30,12);
        long minutes = startTime.until(endTime, ChronoUnit.MINUTES);
        System.out.println("startTime(2020.04.27 18:20:10)和endTime(2020.04.27 18:30:20)相差分钟数:"+minutes); // * 原文章链接https://blog.csdn.net/qq_27471405/article/details/106824023 * 其他均为盗版,公众号:灵儿的笔记(zygxsq)

    }

 

 


Articulo de referencia 

https://blog.csdn.net/u012091080/article/details/79901830

https://blog.csdn.net/chenleixing/article/details/44408875

https://blog.csdn.net/feicongcong/article/details/78224494

Gracias al autor original por compartir, para que los técnicos puedan resolver el problema más rápido 

Mi blog se sincronizará pronto con la comunidad Tencent Cloud + y todos están invitados a unirse: https://cloud.tencent.com/developer/support-plan?invite_code=lnlh8qa6e7an

Supongo que te gusta

Origin blog.csdn.net/qq_27471405/article/details/106824023
Recomendado
Clasificación