如何初始化即时类型?
我试过这个:
Instant instant = new Instant();
Run Code Online (Sandbox Code Playgroud)
但是不起作用..
我需要它,因为在Freemarker之后我必须这样做:
[#assign dateFormated = newDate.from(instant.ofEpochSecond(data.time.seconds))/]
Run Code Online (Sandbox Code Playgroud) Java8Instant.now()给出的当前时间已经采用 UTC 格式。我在CompileJava.net上创建了一个简单的沙箱测试来验证我的预期结果:
Timestamp createdDateUtc = Timestamp.from(Instant.now());
System.out.println(createdDateUtc);
LocalDateTime databaseUtcLocal = createdDateUtc.toLocalDateTime();
ZonedDateTime databaseUtcZoned = databaseUtcLocal.atZone(ZoneId.of("UTC"));
ZonedDateTime userTimezoneTime = databaseUtcZoned.withZoneSameInstant(ZoneId.of("Asia/Qatar"));
System.out.println(userTimezoneTime.format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a")));
Run Code Online (Sandbox Code Playgroud)
注意:当前时间为 2018 年 12 月 1 日上午 11:16 UTC。
当我在在线编译器上运行此代码时,我得到输出:
2018-12-01 11:17:43.637
12/01/2018 02:17:43 PM
Run Code Online (Sandbox Code Playgroud)
但是当我在本地 JBOSS 服务器上运行此代码时,我得到以下输出:
2018-12-01 03:18:07.464
12/01/2018 06:18:07 AM
Run Code Online (Sandbox Code Playgroud)
这里可能出了什么问题?我的服务器 UTC 时钟是否不正确?我的本地服务器的物理位置位于加利福尼亚州。虽然这并不重要,但当我尝试使用Instant.now()太平洋时间来显示 UTC 时间时,这似乎很奇怪。
非常感谢任何帮助!
更新
正如已接受的答案所指出的,问题是我的Timestamp.from()方法:
System.out.println(Instant.now());
System.out.println(Timestamp.from(Instant.now()));
Run Code Online (Sandbox Code Playgroud)
输出:
2018-12-01T11:48:33.153Z
2018-12-01 03:48:33.171
Run Code Online (Sandbox Code Playgroud)
所以现在我的问题发生了变化。如果你有类似的问题,我在这里找到了 Stack Overflow 上的答案。我没有Timestamp.from(Instant.now())使用这个丑陋的混乱:
Timestamp.valueOf(ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime())
Run Code Online (Sandbox Code Playgroud) 假设我在 Java 应用程序中有一个类型为 的字段Instant,并将其作为类型存储在 PostgreSQL 数据库中DATE。
例如,如果我保存,21.02.2019 14:03:59它将被存储为21.02.2019,但是当我从数据库读取时,它将如何重新翻译?
那将会:
21.02.2019 00:00:00.000或者21.02.2019 23:59:59.000?附言。我知道我应该使用Timestamp:)
我试图使用 Instant.parse 方法解析一个非常大的日期(但仍然小于 Instant.MAX),但出现错误。
String input = "78000000-01-01T00:00:00Z";
Instant instant = Instant.parse(input);
Run Code Online (Sandbox Code Playgroud)
例外:
Exception in thread "main" java.time.format.DateTimeParseException: Text '78000000-01-01T00:00:00Z' could not be parsed at index 0
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2106)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:2008)
at java.base/java.time.Instant.parse(Instant.java:399)
Run Code Online (Sandbox Code Playgroud)
BC 日期“-78000000-01-01T00:00:00Z”已解析正常。
我是否发现了 Java 中的错误:)?
我有这段代码可以生成日期和时间,
ZoneId z = ZoneId.of( "Africa/Nairobi" );
Instant instant = Instant.now();
ZonedDateTime zdt = instant.atZone(z);
return zdt.toString();
//2018-03-19T09:03:22.858+03:00[Africa/Nairobi]
Run Code Online (Sandbox Code Playgroud)
是否有类似chrono的库-https: //docs.oracle.com/javase/8/docs/api/java/time/temporal/ChronoField.html字段,我可以用来获取日期,小时和分钟?
时间字段不会提取完整日期。
我必须生成一个唯一的 ID,该 ID 也是可读的,因此不能使用 UUID。所以我想到了使用Instant.toEpochMilli()。可以用作唯一ID吗?
考虑下面的代码
Instant instant = Instant.now();
System.out.println(instant);
Run Code Online (Sandbox Code Playgroud)
结果:
2020-01-13T09:01:06.405Z
Run Code Online (Sandbox Code Playgroud)
现在从上面的结果我想得到当前的小时和当前的分钟。
java ×7
date ×2
java-time ×2
datetime ×1
freemarker ×1
hour ×1
postgresql ×1
server ×1
time ×1
utc ×1