DateTimeFormatter 无法应用于 (java.util.Date)

DateTimeFormatter cannot be applied to (java.util.Date)

我决定使用 DateTimeFormatter 而不是 SimpleDateFormat,因为我听说 SimpleDateFormat 不是线程安全的。我在常量文件中声明了 DateTimeFormatter,如下所示。

public static final DateTimeFormatter GENERAL_TZ_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");

在我的 class 文件中我的实现是这样的。

String value = Constant.GENERAL_TZ_FORMATTER.format(new Date(date.get()));

但这似乎不是正确的实现。因为它说格式 (java.time.temporal.TemporalAccessor) in DateTimeFormatter cannot be applied to (java.util.Date) and returns some error like this, "java.incompatible.types: java.util.Date cannot be converted to java.time.temporal.TemporalAccessor"

我正在为此做背景调查,但仍在努力寻找解决问题的最佳方法。我想知道您对此的想法,这将帮助我找到更好的解决方案。非常感谢您的建议。谢谢。

class Constant {
    public static final SimpleDateFormat GENERAL_TZ_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");

    public static void main(String[] args) {
        String value = Constant.GENERAL_TZ_FORMATTER.format(new Date());
        System.out.println(value);
    }
}

您可以使用,SimpleDateFormat,如上所述。

关于 SimpleDateFormat 的更多信息,您将通过关注 link

了解更多信息

DateTimeFormatter 是 java 新时间 API 的一部分。如果你想使用 DateTimeFormatter 而不是你应该考虑使用 LocalDateTime 而不是 java.util.Date

您可以在您的案例中使用 DateTimeFormator,如下所示:

String value = Constant.GENERAL_TZ_FORMATTER.format(LocalDateTime.now());

new Date(date.get()) 表示 date.get() returns 一个 long 与 milliseconds-since-epoch.

由于您使用的是来自新 Java 时间 API 的 DateTimeFormatter,因此您必须为其提供来自同一 API 的日期对象。 Instant就是这样一个可以用milliseconds-since-epoch值创建的对象。

但是,您使用的格式字符串不能与 Instant 一起使用,因此您首先需要将其转换为相关时区的 ZonedDateTime。在下面的代码中,我们假设您需要 JVM 的默认时区,这是旧的 java.util.Date API 会使用的。

long epochMilli = 1598336543358L;

DateTimeFormatter GENERAL_TZ_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");

Instant instant = Instant.ofEpochMilli(epochMilli);
ZonedDateTime dateTime = instant.atZone(ZoneId.systemDefault());
String value = GENERAL_TZ_FORMATTER.format(dateTime);
       // or:  dateTime.format(GENERAL_TZ_FORMATTER)
System.out.println(value);

由于我在美国东部时区,我得到:

2020-08-25 02:22:23 EDT

作为单个语句,您可以按如下方式编写,但您可能会将其格式化为多行以使其更易于阅读。

// Single line
String value = Instant.ofEpochMilli(epochMilli).atZone(ZoneId.systemDefault()).format(GENERAL_TZ_FORMATTER);
// Formatted for readability
String value = Instant.ofEpochMilli(epochMilli)
                      .atZone(ZoneId.systemDefault())
                      .format(GENERAL_TZ_FORMATTER);