日期时间时间戳对象"2006-04-03 08:00:00+01:00" "+01:00"是什么?



我打印出一个<class 'pandas._libs.tslibs.timestamps.Timestamp'>time变量,它显示为

2006-04-03 08:00:00+01:00

我想知道最后的+01:00是什么?这似乎与夏令时有关?

当我做了

print(time.timestamp())

I am seeing

1144047600.0

是3600(一小时)。

+01:00指定与UTC的偏移量。正表示在UTC之前,所以上午8点+01:00将是UTC上午7点。负数表示在UTC之后,所以8:00 am -01:00将是UTC上午9点。

在这种情况下,"timezone"经常被提及。然而,重要的是要注意,在地理意义上/你可以在IANA数据库中找到它们的许多时区可以在给定的时间点共享相同的UTC偏移量。

同样,UTC偏移量本身并不能告诉你关于DST的任何信息。为此,您需要知道时区。日期/时间、时区和与该时区相关联的规则的组合允许您确定夏令时是否处于活动状态。

对于您的示例日期,请尝试以下操作:

from datetime import datetime
import zoneinfo
dt = datetime.fromisoformat("2006-04-03")
# let's assume a time zone and see if DST is active:
dt = dt.replace(tzinfo=zoneinfo.ZoneInfo("Europe/London"))
print(dt, dt.dst())
# 2006-04-03 00:00:00+01:00 1:00:00
#--> so yes, DST is active, offset of one hour
# let's see which time zones share UTC+1 on that date:
for z in zoneinfo.available_timezones():
if dt.replace(tzinfo=zoneinfo.ZoneInfo(z)).strftime("%z") == "+0100":
print(z)
>>>      
Europe/Guernsey
Europe/Jersey
GB
Africa/Ndjamena
GB-Eire
Europe/London
Europe/Belfast
Eire
Europe/Dublin
Africa/Algiers
Atlantic/Canary
Atlantic/Faroe
Europe/Lisbon
Atlantic/Faeroe
Etc/GMT-1
Africa/Bangui
Africa/Porto-Novo
Africa/Libreville
Africa/Malabo
Africa/Kinshasa
Africa/Lagos
Africa/Luanda
Atlantic/Madeira
Africa/Windhoek
Europe/Isle_of_Man
Africa/Niamey
Portugal
WET
Africa/Douala
Africa/Brazzaville

什么是" +01:00"日期:2006-04-03 08:00:00+01:00…?

这是ISO 8601标准指定格式的时区偏移量。在这个例子中,它告诉2006-04-03 08:00:00+01:00与UTC相差一个小时,即UTC的等效日期时间将是2006-04-03T07:00Z,其中ZZulu的缩写,代表00:00的时区偏移量。

正如您所看到的,计算很简单:要从具有不同偏移量的日期时间中获得UTC日期时间,根据情况减去多余的偏移量或添加较小的偏移量。

我的专业领域是Java,因此,我将使用Java语言进行演示。

import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String args[]) {
DateTimeFormatter parser = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ssXXX");
OffsetDateTime odt = OffsetDateTime.parse("2006-04-03 08:00:00+01:00", parser);
System.out.println(odt);
System.out.println(odt.withOffsetSameInstant(ZoneOffset.UTC));
odt = OffsetDateTime.parse("2006-04-03 08:00:00-01:00", parser);
System.out.println(odt);
System.out.println(odt.withOffsetSameInstant(ZoneOffset.UTC));
}
}

:

2006-04-03T08:00+01:00
2006-04-03T07:00Z
2006-04-03T08:00-01:00
2006-04-03T09:00Z
<<p>

在线演示/KBD>您可能有兴趣了解时区和时区偏移量之间的区别。时区ID通常指定为Region/City,例如America/New_York,Europe/London等。您可以在这里查看tz数据库。一个时区可以有一个或多个时区偏移量,例如Asia/Kolkata只有一个+05:30的时区偏移量。相比之下,Europe/London有两个时区偏移:+01:00在夏季,而+00:00在冬季,根据其夏令时时间表。由于这个原因,使用时区表示日期时间的对象被设计为自动调整其时区偏移量。另一方面,表示带有时区偏移量的日期时间的对象包含固定偏移量值。下面的演示演示了Java中的ZonedDateTime如何自动调整其偏移量。

import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String args[]) {
ZoneId zoneId = ZoneId.of("Europe/London");
ZonedDateTime zdtSummer = LocalDate.of(2022, 5, 20).atStartOfDay(zoneId);
System.out.println(zdtSummer);
ZonedDateTime zdtWinter = LocalDate.of(2022, 11, 20).atStartOfDay(zoneId);
System.out.println(zdtWinter);
}
}

:

2022-05-20T00:00+01:00[Europe/London]
2022-11-20T00:00Z[Europe/London]

Trail: Date Time了解更多关于现代Date-Time API的信息.

最新更新