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

DateTimeFormatter无法应用于(java.util.Date),java,exception,datetime-format,simpledateformat,Java,Exception,Datetime Format,Simpledateformat,我决定使用DateTimeFormatter而不是SimpleDataFormat,因为我听说SimpleDataFormat不是线程安全的。我在常量文件中声明了DateTimeFormatter,如下所示 public static final DateTimeFormatter GENERAL_TZ_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z"); 在我的类文件中,我的实现是这样的 Str

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

public static final DateTimeFormatter GENERAL_TZ_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
在我的类文件中,我的实现是这样的

String value = Constant.GENERAL_TZ_FORMATTER.format(new Date(date.get()));
但这似乎不是正确的实现。因为它说DateTimeFormatter中的格式(java.time.temporal.TemporalAccessor)不能应用于(java.util.Date)并返回如下错误,“
java.compatible.types:java.util.Date不能转换为java.time.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);
    }
}
如上所述,您可以使用,
SimpleDataFormat


关于SimpleDateFormat的更多信息,您将通过以下内容获得想法

DateTimeFormatter
是java新时代API的一部分。如果你想使用<代码> DateTimeFormatter <代码>,你就应该考虑使用<代码> LoalDATeTime< /C> >而不是<代码> java .UTIL.DATE < /Calp>

您可以在如下情况下使用
DateTimeFormator

String value = Constant.GENERAL_TZ_FORMATTER.format(LocalDateTime.now());
newdate(Date.get())
意味着
Date.get()
返回一个
long
,以毫秒计


由于您使用的是新Java Time API中的
DateTimeFormatter
,因此必须从该API中为其提供一个日期对象
Instant
就是这样一个对象,它可以在历元值之后的毫秒内创建

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

long epochMilli=1598336543358L;
DateTimeFormatter GENERAL_TZ_FORMATTER=模式的DateTimeFormatter.of(“yyyy-MM-dd HH:MM:ss z”);
瞬发瞬发=瞬发波切米利(埃波切米利);
ZonedDateTime-dateTime=instant.atZone(ZoneId.systemDefault());
字符串值=GENERAL_TZ_FORMATTER.format(日期时间);
//或者:dateTime.format(通用格式化程序)
系统输出打印项次(值);
由于我在美国东部时区,我得到:

2020-08-2502:22:23美国东部时间
作为一条语句,您可以按如下方式编写,但您可能需要将其格式化为多行,以便于阅读

//单行
字符串值=Instant.ofEpochMilli(epochMilli).atZone(ZoneId.systemDefault()).format(通用格式);
//格式化为可读性
字符串值=瞬时的波切米利(埃波切米利)
.atZone(ZoneId.systemDefault())
.格式(通用格式);

DateTimeFormatter
是java新时代API的一部分。如果你想使用<代码> DateTimeFormatter <代码>,你就应该考虑使用<代码> LoalDATeTime< /Cord>而不是<代码> java. UTIL.DATE < /COD> >类似代码> String值=常数。GuialAlxTyjava格式。格式(LoalDATECTIME.NOW());<但是,在用Java8+编写新代码时,不鼓励这样做。新代码应该使用新的Java时间API,因为旧的日期API被认为是过时的(因为它有缺陷)。替换
java.util.Date
将是比替换
DateTimeFormatter
更好的选择。我不是被否决的投票人,但我猜它被否决是因为我在评论中提到的原因。告诉人们使用过时的API并不是一个有用的答案,特别是当你在回答中甚至没有警告它时,因为OP显然可以/想要使用更新的API。问题首先(明智地)指出提问者不想使用
SimpleDataFormat
,因为它不是线程安全的。通过使用该类,您正是给了他从一开始就试图避免的多线程程序中的错误。此外,
SimpleDataFormat
是一个臭名昭著的类麻烦制造者,正如@Andreas指出的,它早已过时。没有用处,因为它会导致
java.time.DateTimeException:无法从temporal 2020-08-25T02:32:37.624048提取ZoneId