我试图在我的数据库中设置服务器不可知日期时间,我相信这样做的最佳做法是设置UTC日期时间.我的数据库服务器是Cassandra,Java的db驱动程序只能理解Date类型.
所以假设在我的代码中我使用新的Java 8 ZonedDateTime来获取UTC now(ZonedDateTime.now(ZoneOffset.UTC)),我如何将这个ZonedDateTime实例转换为"遗留"Date类?
java java.util.date datetime-conversion java-8 zoneddatetime
Java 8 LocalDateTime有一种ofEpochSecond方法.不幸的是,没有这样的方法ZonedDateTime.现在,我有一个Epoch值和一个明确的ZoneId给定.我怎样才能获得ZonedDateTime这些?
我想将a转换ZonedDateTime为a String格式("dd/MM/yyyy - hh:mm").我知道这在Joda-Time其他类型中是可能的,只是使用它们toString("dd/MM/yyyy - hh:mm")....但这不起作用ZonedDateTime.toString().
ZonedDateTime为String?编辑:
我试图在另一个时区打印时间,结果似乎总是一样:
ZonedDateTime date = ZonedDateTime.now();
ZoneId la = ZoneId.of("America/Los_Angeles");
ZonedDateTime date2 = date.of(date.toLocalDateTime(), la);
// 24/02/2017 - 04:53
System.out.println(DateTimeFormatter.ofPattern("dd/MM/yyyy - hh:mm").format(date));
// same result as the previous one
// 24/02/2017 - 04:53
System.out.println(DateTimeFormatter.ofPattern("dd/MM/yyyy - hh:mm").format(date2));
Run Code Online (Sandbox Code Playgroud)
而且我和洛杉矶不在同一时区.
编辑2:
找到了如何更改时区:
// Change this:
ZonedDateTime date2 = date.of(date.toLocalDateTime(), la); // incorrect!
// To this:
ZonedDateTime date2 = date.withZoneSameInstant(la);
Run Code Online (Sandbox Code Playgroud) 我有一个Spring Boot和Jetty的简单应用程序.我有一个简单的控制器返回一个具有Java 8的对象ZonedDateTime:
public class Device {
// ...
private ZonedDateTime lastUpdated;
public Device(String id, ZonedDateTime lastUpdated, int course, double latitude, double longitude) {
// ...
this.lastUpdated = lastUpdated;
// ...
}
public ZonedDateTime getLastUpdated() {
return lastUpdated;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的RestController我只是有:
@RequestMapping("/devices/")
public @ResponseBody List<Device> index() {
List<Device> devices = new ArrayList<>();
devices.add(new Device("321421521", ZonedDateTime.now(), 0, 39.89011333, 24.438176666));
return devices;
}
Run Code Online (Sandbox Code Playgroud)
我期望ZonedDateTime根据ISO格式进行格式化,但是我得到了类的整个JSON转储:
"lastUpdated":{"offset":{"totalSeconds":7200,"id":"+02:00","rules":{"fixedOffset":true,"transitionRules":[],"transitions":[]}},"zone":{"id":"Europe/Berlin","rules":{"fixedOffset":false,"transitionRules":[{"month":"MARCH","timeDefinition":"UTC","standardOffset":{"totalSeconds":3600,"id":"+01:00","rules":{"fixedOffset":true,"transitionRules":[],"transitions":[]}},"offsetBefore":{"totalSeconds":3600,"id":"+01:00","rules":{"fixedOffset":true,"transitionRules":[],"transitions":[]}},"offsetAfter":{"totalSeconds":7200,"id":"+02:00", ...
Run Code Online (Sandbox Code Playgroud)
我只是有一个spring-boot-starter-web应用程序,使用spring-boot-starter-jetty和排除spring-boot-starter-tomcat.
杰克逊为什么在Spring Boot中表现得像这样?
**更新** …
我正在努力确保调用toString()我的ZonedDateTimeObject符合ISO-8601格式.
该toString()方法的文档说明:
...如果偏移和ID相同,则输出与ISO-8601兼容
这是否意味着存在一种情况,即呼叫
zdt.getOffset()
会返回不同的东西
zdt.getZone().getRules().getOffset(zdt.toInstant())
?
这似乎没有意义.
有人可以提供偏移和ID不相同的示例(即:toString()不符合ISO-8601的地方),以便我可以更好地理解文档中的描述.
谢谢.
我有一个ZonedDateTime像这样构造的对象
ZonedDateTime z = ZonedDateTime.of(LocalDate.now().atTime(11, 30), ZoneOffset.UTC);
Run Code Online (Sandbox Code Playgroud)
我如何将其转换LocalDateTime为瑞士时区?预期结果应该是16 april 2018 13:30.
我正在比较似乎相同的两个日期,但它们包含不同的区域名称:一个是Etc/UTC,另一个是UTC.
根据这个问题:UTC和Etc/UTC时区之间有区别吗? - 这两个区域是相同的.但我的测试失败了:
import org.junit.Test;
import java.sql.Timestamp;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import static org.junit.Assert.assertEquals;
public class TestZoneDateTime {
@Test
public void compareEtcUtcWithUtc() {
ZonedDateTime now = ZonedDateTime.now();
ZonedDateTime zoneDateTimeEtcUtc = now.withZoneSameInstant(ZoneId.of("Etc/UTC"));
ZonedDateTime zoneDateTimeUtc = now.withZoneSameInstant(ZoneId.of("UTC"));
// This is okay
assertEquals(Timestamp.from(zoneDateTimeEtcUtc.toInstant()), Timestamp.from(zoneDateTimeUtc.toInstant()));
// This one fails
assertEquals(zoneDateTimeEtcUtc,zoneDateTimeUtc);
// This fails as well (of course previous line should be commented!)
assertEquals(0, zoneDateTimeEtcUtc.compareTo(zoneDateTimeUtc));
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
java.lang.AssertionError:
Expected :2018-01-26T13:55:57.087Z[Etc/UTC]
Actual :2018-01-26T13:55:57.087Z[UTC]
Run Code Online (Sandbox Code Playgroud)
更具体地说,我希望,这ZoneId.of("UTC")将等于ZoneId.of("Etc/UTC"),但它们不是!
正如@NicolasHenneaux …
我试图使用java 8或utils包将string中的datetime转换为即时.
例如.
String requestTime = "04:30 PM, Sat 5/12/2018";
Run Code Online (Sandbox Code Playgroud)
至
Instant reqInstant should result in 2018-05-12T20:30:00.000Z
Run Code Online (Sandbox Code Playgroud)
reqString位于美国/多伦多时区.
这是我试过的
String strReqDelTime = "04:30 PM, Sat 5/12/2018";
Date date = new SimpleDateFormat("hh:mm a, EEE MM/dd/yyyy").parse(requestTime);
Instant reqInstant = date.toInstant();
Run Code Online (Sandbox Code Playgroud)
上面的代码导致了"2018-05-12T23:30:00Z".
任何帮助表示赞赏.
如何更改现有ZonedDateTime对象的时间部分?我想保留日期和时区,但改变小时和分钟.
我希望得到一些帮助调试此问题.如果我将以下JSON发送到我的后端,它可以正常工作:
{
"approvalRequired": false,
"location": {
"locationName": "<+37.33233141,-122.03121860> +\/- 5.00m (speed 0.00 mps \/ course -1.00) @ 9\/16\/18, 9:24:59 PM Pacific Daylight Time",
"longitude": -122.0312186,
"latitude": 37.332331410000002
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我现在发送以下内容:
{
"approvalRequired": false,
"scheduledStartTime": "2016-01-01T10:24:00+01:00",
"location": {
"locationName": "<+37.33233141,-122.03121860> +\/- 5.00m (speed 0.00 mps \/ course -1.00) @ 9\/16\/18, 9:24:59 PM Pacific Daylight Time",
"longitude": -122.0312186,
"latitude": 37.332331410000002
}
}
Run Code Online (Sandbox Code Playgroud)
我得到了上述错误.在我的后端代码中,我有以下内容:
@DynamoDBTypeConverted(converter = ZonedDateTimeTypeConverter.class)
@DynamoDBAttribute(attributeName = "scheduledStartTime")
public ZonedDateTime scheduledStartTime;
Run Code Online (Sandbox Code Playgroud)
API方法签名如下所示:
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity create(@RequestBody Event event) {...} …Run Code Online (Sandbox Code Playgroud)