Java Fundamentals (04): explicação detalhada de data e hora de uso da API

Código-fonte deste artigo: GitHub · clique aqui || GitEE · clique aqui

1. Hora e data

No desenvolvimento do sistema, data e hora são fatores de negócios importantes e desempenham um papel muito crítico. Por exemplo, geração de dados no mesmo nó de tempo, várias estatísticas e análises de dados com base no intervalo de tempo, tempo unificado de nós de cluster para evitar tempo limite, etc.

Existem vários conceitos-chave de hora e data:

  • Data: Normalmente, a combinação de ano, mês e dia representa a data atual.
  • Hora: Normalmente, a combinação de horas, minutos e segundos representa a hora atual.
  • Fuso horário: os países e regiões do mundo têm longitudes diferentes. Eles são divididos em 24 fusos horários padrão, e a diferença de horário entre os fusos horários adjacentes é de uma hora.
  • Timestamp: 1970-1-1 00:00:00o número total de segundos desde a hora UTC até o presente.

O uso de data e hora no sistema é geralmente para obter a hora e alguns cálculos comuns e processamento de conversão de formato, o que se tornará muito mais complicado em alguns negócios de fuso horário, como comércio global ou compras no exterior em negócios de comércio eletrônico .

2. API nativa JDK

1. Noções básicas de data

Uso básico

java.sql.Date herda java.util.Date, e a maioria dos métodos relacionados chamam diretamente os métodos pais.

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

Regras 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());
    }
}

Ano: hora atual menos 1900;

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

Mês: 0-11 significa 1-12 meses;

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

Talento: expressão normal;

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

Conversão de formato

API de conversão de data não segura para thread, esse uso não é permitido no desenvolvimento da especificação.

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 a data e a hora usadas na versão inicial do JDK, a classe Date foi usada no projeto, mas os métodos de API relacionados foram basicamente abandonados, geralmente usando alguns componentes de tempo de empacotamento secundários. O design desta API é o pior em Java.

2. Atualização do calendário

Como uma classe abstrata, Calendar define os métodos de conversão e cálculo relacionados à data e hora. Esta classe é inspecionada 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, os métodos relacionados em Date são implementados pela migração de Calendar, simplificando a função de Date com foco no empacotamento de entidade de data e hora, Calendar é complexo relacionado a estratégias de cálculo e DateFormat ainda é usado para processamento de formato. No entanto, o Calendário ainda é raramente usado, e a API básica mencionada acima já é uma boa descrição.

3. API de atualização JDK1.8

Em versões posteriores ao Java 8, as classes principais da API incluem LocalDate-date, LocalTime-time e LocalDateTime-date mais hora.

  • LocalDate: a descrição da data é uma classe imutável modificada final, o formato padrão é aaaa-MM-dd.
  • LocalTime: a descrição do tempo é uma classe imutável com modificação final, o formato padrão é hh: mm: ss.zzz.
  • LocalDateTime: a classe imutável que descreve a modificação final da data e 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);
    }
}

Se você é um usuário profundo dos componentes JodaTime, basicamente não há pressão para usar essas APIs.

4. Timestamp

Timestamp também é um método comumente usado em negócios, com base no tipo Longo para expressar a hora, em muitos casos muito melhor do que o formato convencional de data e 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());
    }
}

Deve-se notar aqui que existem várias maneiras de obter carimbos de data / hora em negócios reais, por isso é recomendado unificar as ferramentas e métodos e especificar a precisão, para evitar o problema de parte com precisão de segundo e parte com precisão de milissegundo, de modo a evitar a conversão mútua durante o uso.

Três, componentes JodaTime

Antes do Java8, o componente JodaTime era uma escolha comum na maioria dos sistemas, e havia muitos métodos de processamento de data e hora convenientes e fáceis de usar encapsulados.

Dependência básica:

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

Faça um encapsulamento de classe de ferramenta simples sobre os componentes fornecidos pelo joda-time para garantir um estilo de processamento de negócios 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 ;
    }
}

Quarto, o endereço do código-fonte

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

Leia o rótulo

[ Base Java ] [ Modo de design ] [ Estruturas e algoritmos ] [ Sistema Linux ] [ banco de dados ]

[ arquitetura distribuída ] [ micro serviço ] [ componentes de big data ] [ SpringBoot avançado ] [ Base Spring & Boot ]

[ análise de dados ] [ Diretrizes técnicas Foto ] [ Local de Trabalho ]

Acho que você gosta

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