区域中的LocalDateTime不显示区域的一小时

时间:2018-05-27 19:41:09

标签: java datetime java-time localdate

我在#import the necessary packages from picamera.array import PiRGBArray from picamera import PiCamera import time import cv2 #initialize the camera and grab a reference to the raw camera capture camera = PiCamera() camera.resolution = (640, 480) camera.framerate = 32 rawCapture = PiRGBArray(camera, size=(640, 480)) #allow the camera to warmup time.sleep(0.1) #capture frames from the camera for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True): # grab the raw NumPy array representing the image, then initialize the timestamp # and occupied/unoccupied text image = frame.array image.setflags(write=True) cv2.imshow("Frame", image) key = cv2.waitKey(1) & 0xFF # clear the stream in preparation for the next frame rawCapture.truncate(0) # if the q key was pressed, break from the loop if key == ord("q"): break cv2.destroyAllWindows() 中有UTC的日期和时间。我想显示给定区域的时间和日期,但无论区域我得到的是同一时间。对于以下代码:

LocalDateTime lastUpdated

我得到了:

System.out.println(lastUpdated);
System.out.println(lastUpdated.atZone(ZoneId.of("Europe/Paris")));
System.out.println(lastUpdated.atZone(ZoneId.of("America/Los_Angeles")));

但我想得到的是:

2018-05-26T21:33:46
2018-05-26T21:33:46+02:00[Europe/Paris]
2018-05-26T21:33:46-07:00[America/Los_Angeles]

区域信息对我来说是可选的。我只需要在区域适当的时间。有没有办法实现它?

2 个答案:

答案 0 :(得分:4)

我的印象是你把“无时区信息”与“UTC时区”混淆等同......因为当我不说时区是什么时候它是UTC ......对吗?

错误。如果您没有说出时区是什么,那么您没有关于时区的任何具体信息。

所以你的2018-05-26T21:33:46不是日期和时间,UTC,它是这个日期的日期和时间的概念,不知道时区的概念存在。当你去问某人今天的日期和现在的时间时,你会得到什么。不,他们不会认为你可能也想要考虑它在你现在所在的时区。那个人根本就不会想到有时区这样的东西,但他会能告诉它是什么日子和时间。

因此,要将日期时间UTC转换为其他时区的日期时间,请执行以下操作:

ZonedDateTime time = lastUpdated.atZone(ZoneId.of("UTC"));
System.out.println(time);
System.out.println(time.withZoneSameInstant​(ZoneId.of("Europe/Paris")));
System.out.println(time.withZoneSameInstant​(ZoneId.of("America/Los_Angeles")));

答案 1 :(得分:1)

您正在使用LocalDateTime,这是一个没有时区的日期和时间指示,就像您在自己的时区与人讨论日期和时间时所使用的那样。 atZone会及时返回该日期的ZonedDateTime,就像您在该时区发表的那样。

因此,为了获得不同的时间,您需要将ZonedDateTime转换为Instant,这是一个时间点,为整个星球确定。然后Instant可以再次转换为ZonedDateTime

LocalDateTime lastUpdated = LocalDateTime.now();
ZonedDateTime zonedDateTime = lastUpdated.atZone(ZoneId.of("Europe/Paris"));
System.out.println(zonedDateTime);
ZonedDateTime other = ZonedDateTime.ofInstant(zonedDateTime.toInstant(), ZoneId.of("America/Los_Angeles"));
System.out.println(other);

输出:

2018-05-27T21:53:53.754+02:00[Europe/Paris]
2018-05-27T12:53:53.754-07:00[America/Los_Angeles]