Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8–;使用时区从LocalDateTime创建即时_Java_Date_Java 8_Localdate - Fatal编程技术网

Java 8–;使用时区从LocalDateTime创建即时

Java 8–;使用时区从LocalDateTime创建即时,java,date,java-8,localdate,Java,Date,Java 8,Localdate,我在数据库中以字符串格式ddMMyyyy和hh:mm存储了一个日期和时区。 我想根据这些信息创建一个瞬间,但我不知道怎么做 差不多 LocalDateTime dateTime = LocalDateTime.of(2017, Month.JUNE, 1, 13, 39); Instant instant = dateTime.toInstant(TimeZone.getTimeZone("ECT")); 您可以首先使用该时区创建一个ZonedDateTime,然后调用toInstant: L

我在数据库中以字符串格式ddMMyyyy和hh:mm存储了一个日期和时区。 我想根据这些信息创建一个瞬间,但我不知道怎么做

差不多

LocalDateTime dateTime = LocalDateTime.of(2017, Month.JUNE, 1, 13, 39);
Instant instant = dateTime.toInstant(TimeZone.getTimeZone("ECT"));

您可以首先使用该时区创建一个
ZonedDateTime
,然后调用
toInstant

LocalDateTime dateTime = LocalDateTime.of(2017, Month.JUNE, 15, 13, 39);
Instant instant = dateTime.atZone(ZoneId.of("Europe/Paris")).toInstant();
System.out.println(instant); // 2017-06-15T11:39:00Z

我也改为使用完整的时区名称(根据巴兹尔的建议),因为它不那么模棱两可。

忘记旧的时区类。使用
ZoneId
,因为它是线程安全的,您可以使用最后一个静态字段来存储区域

LocalDateTime dateTime = LocalDateTime.of(2017, Month.JUNE, 1, 13, 39);
ZonedDateTime.of(dateTime, ZoneId.of("ECT")).toInstant();

我认为以下代码应该可以工作:

LocalDateTime time = LocalDateTime.of(2017, Month.JUNE, 15, 13, 39);
ZonedDateTime.of(time, TimeZone.getTimeZone("ZONE").toZoneId()).toInstant();

您只需将“ZONE”替换为所需的时区。

您的意思是
ZoneDateTime.ofInstant(instant,timezone.getDefault())
?@soorapadman将返回ZoneDateTime。OP需要一个瞬间。不要用3-4个字符的缩写来表示时区。这些不是实时时区,不是标准化的,甚至不是唯一的!以
大陆/地区
的格式使用,如
亚洲/加尔各答
太平洋/奥克兰
。如果“ECT”指的是厄瓜多尔时间,请使用(“美国/瓜亚基尔”)分区。如果您指的是中欧,请使用适当的
Europe/…
区域名称。此问题与链接问题不同。这个问题与毫秒计数没有直接关系。“我有一个以字符串格式ddMMyyyy和hh:mm存储在数据库中的日期和时区。”不,如果在定义数据库列时使用了日期-时间数据类型,例如
带时区的时间戳
,则不需要。日期时间列没有“格式”,因为它们不是字符串/文本。将日期时间值作为日期时间对象而不是字符串检索<代码>Instant Instant=myResultSet.getObject(…,Instant.class)否,时区是传统类,现在被ZoneId和ZoneOffset取代。避免遗留日期时间类。当然,不要将遗留类与java.time类混合使用。请更正或删除您的答案。这几乎是一个完美的答案,但您不应该鼓励使用3-4个字母的伪时区代码。而是以
大陆/地区
格式使用。我猜作者指的是“ECT”的时间
ZoneId.of(“America/Guayaquil”)
@BasilBourque“ECT”实际上是欧洲中部时间(
Europe/Paris
),所以我可以理解为什么使用全名会更好;)我只看到“CET”是中欧时间。但这就是重点,这3-4个字母的代码是一个模棱两可的噩梦,应该像瘟疫一样避免。@a行日期模棱两可。午夜过后的几分钟,法国巴黎迎来了新的一天,而魁北克山仍然是“昨天”。如果您希望日期以UTC为单位,请使用
OffsetDateTime
确定一个时刻:
OffsetDateTime.of(LocalDate.of(2018,1,23),LocalTime.MIN,ZoneOffset.UTC)
,因为2-4个字母的缩写(ET,PST,EST,CST,IST等)不是真正的时区,不是标准化的,也不是唯一的。例如:IST=冰岛标准时间、爱尔兰标准时间、印度标准时间等。参见维基百科,查看
大陆/地区格式的标准时区名称列表。