自 Java 9 以来 Java 日期和时间 API 发生了变化。 LocalDateTime 现在具有微秒精度。
Java 9 具有 java.time.Clock 的全新实现,能够以比毫秒(十进制小数的三位数字)更精细的分辨率捕获当前时刻。
我们从后端服务中获得以微秒为单位的时间。
System.currentTimeMillis > 1565245051795 > 2019-08-08T06:17:31.795
Service.getTime > 1565245051795306 > 2019-08-08T06:17:31.795306
Run Code Online (Sandbox Code Playgroud)
为了构造在我们的应用程序中使用的 LocalDateTime,我们执行
long timeMicros = service.getTime();
long timeMillis = timeMicros / 1000;
LocalDateTime ldt = Instant.ofEpochMilli(timeMillis).atZone(ZoneId.systemDefault()).toLocalDateTime();
Run Code Online (Sandbox Code Playgroud)
为了查询服务,我们再次需要时间微秒,然后我们做
long timeMillis = dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
long timeMicros = timeMillis * 1000;
Run Code Online (Sandbox Code Playgroud)
问题是我们没有取回时间微秒的精度。
是否可以创建具有微秒精度的 Instant ?
我们现在使用的是 Java 11。当我们的一个 JUnit 测试由于增加的微秒精度而失败时,我注意到了这一变化。
对于 JUnit 测试,我找到了一个解决方法:
private static final LocalDateTime START = LocalDateTime.now().truncatedTo(ChronoUnit.MILLIS);
Run Code Online (Sandbox Code Playgroud)
我不确定这是一种解决方法还是实际的解决方案,但添加时间戳的最后三微秒数字似乎有效。
System.currentTimeMillis > 1565245051795 > 2019-08-08T06:17:31.795
Service.getTime > …Run Code Online (Sandbox Code Playgroud) 在我的 Java(使用 Spring Boot 和 Spring Data JPA)应用程序中,我通常使用 Instant。另一方面,我想对时间值使用最合适的数据类型。
您能帮我解释一下这些问题吗?在以下情况下,我应该选择哪种数据类型来保存日期和时间:
1.将时间精确地保留为时间戳(我不确定Instant是否是最佳选择)?
2.对于正常情况,当我只需要日期和时间时(据我所知,旧库已经过时,但不确定我应该使用哪个库)。
我还考虑了时区,但不确定使用 LocalDateTime 与 UTC 是否可以解决我的问题。
任何帮助,将不胜感激。
使用spring boot 2.它已经包含了Jackson Java8 API.但是LocalDatetime的JSON格式是一种人类可读的格式.我希望通过杰克逊成为EPOCH,只是一个真正的时间戳.
我知道如何在Java8 API中将LocatDatetime转换为EPOCH.我的问题是如何配置Spring Boot 2来做到这一点.没有添加客户ObjectMapper可以吗?
我想配置jackson为以以下格式输出任何日期/时间值:
spring.jackson.date-format=yyyy-MM-dd'T'HH:mm:ss
我正在获取许多数据库行,并将它们作为json地图返回。
@RestController
public class MyService {
@GetMapping
public List<Map<String, Object>> get(Param params) {
return jdbcTemplate.queryForList(sql, params);
}
}
Run Code Online (Sandbox Code Playgroud)
问题:数据库和jvm的默认时区为Europe/Berlin,因此为UTC + 2。因此,杰克逊会先自动将接收java.sql.Timestamp到的所有数据库转换为UTC(减去2小时),然后通过json输出它们。
在mysql数据库本身中,它是一种datetime类型。
但是我只想让杰克逊按原样输出时间戳,而无需事先转换!是否可以跳过时区校正?
我只想忽略时区而不进行交谈。剪下来
我在我的应用程序中编写了一个实用程序,它接受时区并返回一个日期(java.util.Date),如下所示 -
// Inside MyDateHelper.java
public static java.util.Date getTimeForTimeZone(String timeZoneId)
{
final Date currentDate = Calendar.getInstance(TimeZone.getTimeZone(timeZoneId)).getTime();
return currentDate;
}
Run Code Online (Sandbox Code Playgroud)
我在互联网上进行了研究,发现 Date 中没有任何时区信息。相反,它是一个从 1970 年开始的长值的包装器。所以,我的问题是我是否必须获取当前发生事务的日期时间时刻以存储在日期字段(类型为 java.util.Date)中),这个实用程序有什么用吗?
出于所有实际目的,这两行代码是否实现了相同的目的?
transactionEntry.setTime(MyDateHelper.getTimeForTimeZone("UTC+7:00"));
Run Code Online (Sandbox Code Playgroud)
或者
transactionEntry.setTime(new Date());
Run Code Online (Sandbox Code Playgroud)
我还检查了新的 Java 8 Time API,但就我的目的而言,我认为这样做也是一种矫枉过正,并且没有取得更多成果new Date()-
Date date4 = new Date();
LocalDateTime localDate = date4.toInstant().atZone(ZoneId.of("UTC+07:00")).toLocalDateTime();
final ZonedDateTime dateWithZone = localDate.atZone(ZoneId.of("UTC+07:00"));
Date dateOutput = Date.from(dateWithZone.toInstant());
transactionEntry.setTime(dateOutput);
Run Code Online (Sandbox Code Playgroud)
整个目的是捕获时区事务发生的时间,但我只能将时间存储为 java.util.Date。无论交易发生在哪个时区,Date 都能够正确捕获时间的瞬间,对吧?有人可以证实这种理解是正确的吗?
当我将 Javascript 日期传递给 JAX-RS 服务时,我收到:
我传递给后端的信息来自我映射到 javascript Date 对象上的 Angular Material Datepicker 组件。
我知道该字符串具有后端不相关的信息,但我不知道如何在调用 POST 之前传递正确/修改的值。
我应该传递 String 而不是 Date 对象吗?这是正确的方法吗?
有没有办法将格式为“2018-06-04T22:00:00.000Z”或“2018-06-05T00:00:00.000Z”的日期传递给LocalDate和LocalDateTime?
我使用 LocalDate 和 LocalDateTime 因为我不想处理时区。即使我更改时区,该值也应该始终相同。
在我遇到问题之前,因为服务器和客户端之间存在 1 小时的差异。因此,当我过去从 Web 服务器选择日期时,客户端可能会在组件上看到前一天,因为它从午夜开始返回 1 小时。
我从外部API收到UTC时间戳字符串,我需要将其存储为LocalDateTime。换句话说,如果时间戳在启用夏令时的时段内,则应将其调整为DST(通常是一个小时)。
我将传入的字符串解析为OffsetDateTime,然后将其转换为ZonedDateTime,然后转换为Instant。此时,DST时间已正确调整。但是,当我LocalDateTime从创建时Instant,它会丢失调整。
@Test
public void testDates() {
final DateTimeFormatter OFFSET_FORMAT = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXX");
final ZoneId zoneId = TimeZone.getDefault().toZoneId();
final String summerTime = "2019-09-11T10:00:00.000+0000";
final String winterTime = "2019-12-11T10:00:00.000+0000";
OffsetDateTime odtSummer = OffsetDateTime.parse(summerTime, OFFSET_FORMAT);
OffsetDateTime odtWinter = OffsetDateTime.parse(winterTime, OFFSET_FORMAT);
ZonedDateTime zdtSummer = odtSummer.toLocalDateTime().atZone(zoneId);
ZonedDateTime zdtWinter = odtWinter.toLocalDateTime().atZone(zoneId);
Instant instSummer = zdtSummer.toInstant();
Instant instWinter = zdtWinter.toInstant();
System.out.println("instSummer = " + instSummer); // instSummer = 2019-09-11T09:00:00Z
System.out.println("instWinter = " + instWinter); // …Run Code Online (Sandbox Code Playgroud) 菜鸟在这里!首先,我试图相互比较dateOne和dateTwo相互比较,然后(> 0)取最近日期的那个并将其与cutOffDate.
如果是之后cutOffDate,则将其设置为FinalDate,否则设置cutOffDate为FinalDate。我怎样才能做到这一点?
我不确定我在这里是否在正确的轨道上,我收到以下错误dateOne.compareTo(dateTwo):
String 类型中的 compareTo(String) 方法不适用于参数 (Date)
public DateServiceImpl process(final DateServiceImpl item) throws Exception {
final Date dateOne = item.getDateOne();
final Date dateTwo = item.getDateTwo();
final BigDecimal amountOne= item.getAmountOne();
final BigDecimal amountTwo= item.getAmountTwo();
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
String cutOffDate = "01/01/2020";
Date cDate = sdf.parse(cutOffDate);
if ((amountOne.compareTo(BigDecimal.ZERO) > 0) && (amountTwo.compareTo(BigDecimal.ZERO) > 0)){
if (dateOne.compareTo(dateTwo) <= 0) {
item.setFinalDate(cDate); …Run Code Online (Sandbox Code Playgroud) 我正在尝试检查特定日期是否在特定日期范围内。我在 Java 中遇到了 Joda 时间间隔。但它作为结束时间独占。
那么是否有一种替代方法可以作为结束时间(包括结束时间)
我LocalDateTime用来代表时间.在调试模式下,我注意到时间格式不在ISO 8601中,这使我很难直接发送到其他api.
请求类:
public class AgreementRequest {
@NonNull
private String name;
@NonNull
private String description;
@JsonProperty("start_date")
@DateTimeFormat(iso = DATE_TIME)
@NonNull
private String startDate;
}
Run Code Online (Sandbox Code Playgroud)
初始化:
request = AgreementRequest.builder()
.name("Premium subscription")
.description("Montly subscription")
.startDate(LocalDateTime.now().plusDays(1).toString()).build();
Run Code Online (Sandbox Code Playgroud)
在LocalDateTime.toString无论是在ISO 8601,信是不是z在ISO8601不见了.
我有objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);残疾,这是问题吗?
我在 Postgres 的下表中使用了Java 8 和 Postgres-11以及 Spring Boot 2.1.6.RELEASE。我已经解决了这个问题和这个问题,但我真的想使用 Java 8 Date API 而不是 Java 7。
CREATE TABLE note(
note_id serial PRIMARY KEY,
message varchar(255) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
Run Code Online (Sandbox Code Playgroud)
我创建了如下所示的模型类,但与我需要的不匹配。
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Entity
public class Note extends AuditEnabledEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "note_id")
private int noteId;
@Column(name = "message")
private String message;
@Column(name = "created_at")
private LocalDateTime createdAt;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将1980-02-22T00:00:00Z解析为"java.util.Date"使用
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SS'Z'").parse(stringdate)
Run Code Online (Sandbox Code Playgroud)
但我得到了错误
由以下原因引起:java.text.ParseException:无法解析的日期.
如何将这样的字符串解析为Date以获得时间(以毫秒为单位)?我试过用SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SS'Z'")和SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
我有这样存储的特定操作的 UTC 时间偏移:(这是 UTC+2)
double utc = 2.0;
Run Code Online (Sandbox Code Playgroud)
如何在 Java 中使用此双时间偏移量获取该时区的当前时间?