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);
我决定使用 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);