java.util.Date toString()
方法以本地时区显示日期 .
有几种常见的情况我们希望在UTC中打印数据,包括日志,数据导出和与外部程序的通信 .
-
在UTC中创建
java.util.Date
的字符串表示形式的最佳方法是什么? -
如何用更好的格式替换j.u.Date的
toString()
格式,这是不可排序的(谢谢@JonSkeet!)?
附录
我认为以自定义格式和时区打印日期的标准方法非常繁琐:
final Date date = new Date();
final String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS zzz";
final SimpleDateFormat sdf = new SimpleDateFormat(ISO_FORMAT);
final TimeZone utc = TimeZone.getTimeZone("UTC");
sdf.setTimeZone(utc);
System.out.println(sdf.format(date));
我正在寻找一个单线像:
System.out.println(prettyPrint(date, "yyyy-MM-dd'T'HH:mm:ss.SSS zzz", "UTC"));
7 回答
好吧,如果你只想使用java.util.Date,这里有一个小技巧你可以使用:
String dateString = Long.toString(Date.UTC(date.getYear(),date.getMonth(),date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds()));
在有用的评论之后,我完全重建了日期格式化程序 . 用法应该是:
做空(单线)
将一次性对象(时区,格式)表示为字符串
从包装盒中支持有用的,可排序的ISO格式和传统格式
如果您认为此代码有用,我可以在github中发布源代码和JAR .
用法
代码
(此代码也是a question on Code Review stackexchange的主题)
为什么不使用java.text.SimpleDateFormat?
或者看:http://www.tutorialspoint.com/java/java_date_time.htm
java.time
在Java 8及更高版本中,我们内置了新的java.time package(Tutorial) . 灵感来自Joda-Time,由JSR 310定义,并由ThreeTen-Extra项目扩展 .
最好的解决方案是 sort your date-time objects rather than strings . 但如果您必须使用字符串,请继续阅读 .
Instant表示时间轴上的一个时刻,基本上在UTC(有关详细信息,请参阅类doc) . toString实现默认使用DateTimeFormatter.ISO_INSTANT格式 . 这种格式包括零,三,六或九位数字,根据需要显示一秒的分数,最高达到nanosecond精度 .
如果必须与旧的
Date
类进行互操作,则通过添加到旧类的新方法转换为/从java.time转换 . 示例:Date::toInstant
.如果您需要在小数秒内具有一致的位数或者您不需要小数秒,则可能需要使用备用格式化程序 .
如果你想截断一秒的分数,另一条路线是使用
ZonedDateTime
而不是Instant
,调用它的method to change the fraction to zero .请注意,我们必须为
ZonedDateTime
指定时区(因此名称) . 在我们的情况下,这意味着UTC . ZoneID的子类ZoneOffset拥有方便的constant for UTC . 如果省略时区,则隐式应用JVM的current default time zone .Joda-Time
UPDATE: Joda -Time项目现在处于维护模式,团队建议迁移到java.time类 .
如果使用Joda-Time 2.3库,则很容易 . ISO 8601是默认格式 .
时区
在下面的代码示例中,请注意我指定的是时区而不是默认时区 . 在这种情况下,我根据您的问题指定UTC . 最后的
Z
,用"Zulu"表示,表示没有时区偏离UTC .示例代码
输出...
java.time.Instant
只需使用
java.time
的Instant即可 .这只是打印:
Instant.toString
始终给出UTC时间 .输出通常是可排序的,但有一些不幸的例外 .
toString
为您提供足够的三位小数组,以呈现它所保持的精度 . 在Mac上的Java 9上,Instant.now()
的精度似乎是微秒,但我们应该预计,在大约一个例子中,它将达到整数毫秒并且只打印三个小数 . 具有不等小数位数的字符串将按错误的顺序排序(除非您编写自定义比较器以将其考虑在内) .Instant
是java.time
中的一个类,现代Java日期和时间API,我热烈建议您使用而不是过时的Date
类 .java.time
内置于Java 8及更高版本中,并且已经向后移植到Java 6和7 .基于the accepted answer above的以下简化代码对我有用:
我希望这有助于某人 .
如果XStream是依赖项,请尝试: