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:00
o 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 ]