DateTimeFormatter无法应用于(java.util.Date)
我决定使用DateTimeFormatter而不是SimpleDataFormat,因为我听说SimpleDataFormat不是线程安全的。我在常量文件中声明了DateTimeFormatter,如下所示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
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