Lea la zona horaria, la marca de tiempo y las operaciones basadas en Java en un artículo

concepto importante

1. UTC y UTC+8

UTC es la hora estándar mundial, UTC + 8 es la hora estándar del Octavo Distrito Este y China pertenece al Octavo Distrito Este, que es la hora de Beijing.
+8 es sumar 8 horas. El diagrama de división de zonas horarias es el siguiente:

Es decir:
si la hora UTC es ahora 2023-08-08 01:00:00(1:00 a. m. del 8 de agosto de 2023), entonces la hora de Beijing es ahora 2023-08-08 09:00:00(9:00 a. m.).

2. Marca de tiempo

La marca de tiempo es un número, que comienza el 1 de enero de 1970 en UTC, que es 0, y se resta este tiempo del tiempo posterior para obtener el número de segundos.
Por ejemplo, la marca de tiempo de UTC 1970-01-01 00:00:00es 0. 1970-01-01 00:01:00La marca de tiempo es 60 un minuto después .

¿Por qué empezar con este tiempo?
Debido a que se trata de una convención del sistema operativo UNIX, el 1 de enero de 1970 se establece como el comienzo de la era del tiempo, y muchos lenguajes y sistemas relacionados con las computadoras siguen esta convención.

Obtener la marca de tiempo de una hora determinada

	@Test
	public void Timestamp(){
		LocalDateTime dateTime = LocalDateTime.of(1970, 1, 1, 0, 0, 0);// 获取时间戳(秒数)
		long timestamp = dateTime.toEpochSecond(ZoneOffset.UTC);//设置时区后获取时间戳
		System.out.println("Timestamp: " + timestamp); //0, 时间戳开始
	}
  • LocalDateTime es una hora sin información de zona horaria
  • ZoneOffset.UTC representa la zona horaria de UTC

Java también proporciona una manera sencilla de obtener la marca de tiempo de la hora actual.

System.currentTimeMillis()

Obtener la hora en una zona horaria

ZonedDateTime es una hora que necesita especificar una zona horaria, por ejemplo, a las 8 am del 1 de enero de 1970, hora de Beijing, se puede expresar de la siguiente manera:

ZonedDateTime utc8DateTime= ZonedDateTime.of(1970, 1, 1, 8, 0, 0,0, ZoneId.of("UTC+8"));

Debido a que la hora en el Octavo Distrito Este está 8 horas por delante de la hora estándar UTC, la hora anterior también es la hora de inicio de la marca de tiempo.

	@Test
	public void zoneTimeStamp(){
		ZonedDateTime utc8DateTime= ZonedDateTime.of(1970, 1, 1, 8, 0, 0,0, ZoneId.of("UTC+8"));
		long timestamp =utc8DateTime.toEpochSecond();
		System.out.println("Timestamp1: " + timestamp);  //0
	}

Por supuesto, la hora de la zona horaria también se puede convertir desde LocalDateTime, por ejemplo:

		LocalDateTime lcoalDateTime = LocalDateTime.of(1970, 1, 1, 8, 0, 0);
		ZonedDateTime zonedDateTime = ZonedDateTime.of(lcoalDateTime, ZoneId.of("UTC+8"));
		timestamp =zonedDateTime.toEpochSecond();
		Assert.assertEquals(0, timestamp);

visualización formateada de la hora

Utilice DateTimeFormatter para mostrar la hora como cadenas en diferentes formatos. El código de muestra es el siguiente:

	
	@Test
	public void dateTimeformatter() {
		LocalDateTime lcoalDateTime = LocalDateTime.of(1970, 1, 1, 8, 0, 0);
		ZonedDateTime zonedDateTime = ZonedDateTime.of(lcoalDateTime, ZoneId.of("UTC+8"));
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); 
		String lcoalDateTimeStr = formatter.format(lcoalDateTime);
		Assert.assertEquals("1970-01-01 08:00:00", lcoalDateTimeStr);
		
		String zonedDateTimeStr =  formatter.format(zonedDateTime);
		Assert.assertEquals("1970-01-01 08:00:00", zonedDateTimeStr);
	}

Obtener la hora actual en Beijing

La hora actual se puede obtener mediante ZonedDateTime.now():

	@Test
	public void getCurrentUtc8Time() {
        // 获取UTC+8时区
        ZoneId utc8ZoneId = ZoneId.of("UTC+8");
        // 获取当前时间
        ZonedDateTime now = ZonedDateTime.now(utc8ZoneId);
        // 格式化为字符串
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");     
        String currentTime = now.format(formatter);
        // 输出时间
        System.out.println("Current time in UTC+8: " + currentTime);
	}

Si desea obtener la hora estándar UTC, debe modificar la zona horaria obtenida anteriormente:

ZoneId.of("UTC");

convertir marca de tiempo a tiempo

Una marca de tiempo se puede convertir en hora mediante Instant.

	@Test
	public void timeMillisToUtc() {
		long timeMillis = 0L;
		Instant instant = Instant.ofEpochMilli(timeMillis);
		LocalDateTime utcDateTime = LocalDateTime.ofInstant(instant, ZoneId.of("UTC"));
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
		String utcTime = utcDateTime.format(formatter);
		Assert.assertEquals("1970-01-01 00:00:00", utcTime);
	}

Nota: la marca de tiempo no tiene nada que ver con el tiempo.

En el desarrollo real, cuando se encuentra con un escenario de este tipo: el tiempo de vencimiento válido del token de autorización de algunas aplicaciones tiene el formato de una marca de tiempo, que es un número entero largo, alguien preguntará: "Esto ha sido procesado por +8". ¿tiempo?" Obviamente, esta pregunta es muy poco profesional.

Una marca de tiempo corresponde a una hora, es decir, una hora basada en la hora de inicio UTC. Esta marca de tiempo se puede convertir a una hora en una zona horaria diferente, pero la marca de tiempo en sí no tiene diferencia de zona horaria. Es decir, la marca de tiempo es 0, que corresponde a las cero horas del 1 de enero de 1970 en hora UTC, es decir, las 8:00 am del 1 de enero de 1970.

Resumir

  • LocalDateTime es una clase de procesamiento de tiempo que no tiene nada que ver con zonas horarias.
  • ZonedDateTime es una clase de procesamiento de tiempo relacionada con la zona horaria
  • La hora de inicio de la marca de tiempo es las 0:00 del 1 de enero de 1970, que son las 8:00 am, hora de Beijing.
  • Las marcas de tiempo son independientes de las zonas horarias.

ejemplo en línea



Supongo que te gusta

Origin blog.csdn.net/oscar999/article/details/132093892
Recomendado
Clasificación