相关疑难解决方法(0)

从微秒创建 Java DateTime Instant

自 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 java-time java-9 java.time.instant java-11

3
推荐指数
1
解决办法
2651
查看次数

我应该在 Java 实体中使用 Instant、DateTime 或 LocalDateTime?

在我的 Java(使用 Spring Boot 和 Spring Data JPA)应用程序中,我通常使用 Instant。另一方面,我想对时间值使用最合适的数据类型。

您能帮我解释一下这些问题吗?在以下情况下,我应该选择哪种数据类型来保存日期和时间:

1.将时间精确地保留为时间戳(我不确定Instant是否是最佳选择)?

2.对于正常情况,当我只需要日期和时间时(据我所知,旧库已经过时,但不确定我应该使用哪个库)。

我还考虑了时区,但不确定使用 LocalDateTime 与 UTC 是否可以解决我的问题。

任何帮助,将不胜感激。

java timestamp date spring-data-jpa spring-boot

3
推荐指数
2
解决办法
4050
查看次数

对于Spring boot 2,如何将Java8 Time API序列化为时间戳(EPOCH)?

使用spring boot 2.它已经包含了Jackson Java8 API.但是LocalDatetime的JSON格式是一种人类可读的格式.我希望通过杰克逊成为EPOCH,只是一个真正的时间戳.

我知道如何在Java8 API中将LocatDatetime转换为EPOCH.我的问题是如何配置Spring Boot 2来做到这一点.没有添加客户ObjectMapper可以吗?

time jackson spring-boot

2
推荐指数
1
解决办法
2279
查看次数

如何在Spring-MVC中跳过杰克逊时区校正?

我想配置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 spring spring-mvc jackson

2
推荐指数
2
解决办法
5086
查看次数

使用 TimeZone 的 Calendar.getInstance 与 new Date()

我在我的应用程序中编写了一个实用程序,它接受时区并返回一个日期(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 都能够正确捕获时间的瞬间,对吧?有人可以证实这种理解是正确的吗?

java timezone datetime java-8 java-time

2
推荐指数
1
解决办法
2626
查看次数

如何使用 JAX-RS 在 REST 中将 Javascript 日期传递给 Java LocalDate 和 LocalDateTime

当我将 Javascript 日期传递给 JAX-RS 服务时,我收到:

  1. 如果目标字段是 LocalDate: Text '2018-06-04T22:00:00.000Z' could not be parsed, unparsed text found at index 10". BackEnd 对 "2018-06-04" 没问题,我试过邮差。
  2. 如果目标字段是 LocalDateTime: Text '2019-04-02T20:16:24.999Z' could not be parsed, unparsed text found at index 23. The BackEnd is OK with "2019-04-02T20:16:24",我试过邮递员。

我传递给后端的信息来自我映射到 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 小时。

javascript java rest jax-rs angular

2
推荐指数
1
解决办法
5921
查看次数

如何通过DST调整将UTC字符串转换为LocalDateTime?

我从外部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)

java datetime

2
推荐指数
1
解决办法
150
查看次数

如何比较 Java 中的两个日期,然后将结果与另一个日期进行比较?

菜鸟在这里!首先,我试图相互比较dateOnedateTwo相互比较,然后(> 0)取最近日期的那个并将其与cutOffDate.

如果是之后cutOffDate,则将其设置为FinalDate,否则设置cutOffDateFinalDate。我怎样才能做到这一点?

我不确定我在这里是否在正确的轨道上,我收到以下错误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

2
推荐指数
1
解决办法
100
查看次数

Java 中是否有 Joda-Time 间隔的替代方法,它可以用作结束时间

我正在尝试检查特定日期是否在特定日期范围内。我在 Java 中遇到了 Joda 时间间隔。但它作为结束时间独占。

那么是否有一种替代方法可以作为结束时间(包括结束时间)

java jodatime

2
推荐指数
1
解决办法
74
查看次数

默认情况下,LocalDateTime不是ISO8601

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);残疾,这是问题吗?

java jackson

1
推荐指数
1
解决办法
555
查看次数

Postgres 中字段 TIMESTAMP NOT TIME ZONE DEFAULT CURRENT_TIMESTAMP 的 JPA 模型类?

我在 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)

java postgresql spring-boot jpa-2.2 postgresql-11

1
推荐指数
1
解决办法
1万
查看次数

无法解释的日期例外(1980-02-22T00:00:00Z)

我正在尝试将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")

java date kotlin

-1
推荐指数
1
解决办法
117
查看次数

如何获取时区的当前时间

我有这样存储的特定操作的 UTC 时间偏移:(这是 UTC+2)

double utc = 2.0;
Run Code Online (Sandbox Code Playgroud)

如何在 Java 中使用此双时间偏移量获取该时区的当前时间?

java

-1
推荐指数
1
解决办法
104
查看次数