我试图生成一个随机的日期和时间,并将其转换为 "yyyy-MM-dd'T'HH:mm:ss'Z'"
格式。
以下是我尝试过的:
public static String generateRandomDateAndTimeInString() {
LocalDate date = LocalDate.now().minus(Period.ofDays((new Random().nextInt(365 * 70))));
System.out.println("date and time :: " + date.toString());
return formatDate(date) ;
}
public static String formatDate(LocalDate date){
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
return dateFormat.format(date);
}
但是排队的时候 dateFormat.format(date)
,投诉:
java.lang.illegalargumentexception:无法将给定对象格式化为日期
第二个问题是,打印输出不包含时间:
date :: 1998-12-24
我不知道怎么让它工作。
3条答案
按热度按时间u91tlkcl1#
输出示例:
日期和时间:1983-08-24t00:00z
注意事项:
让java.time从年转换为天。它提供了更可读和更正确的代码(一年并不总是365天)。
若要在字符串中包含时间和utc偏移量,请将
ZonedDateTime
或者一个OffsetDateTime
因为这样的物体持有一天中的时间和偏移量。一LocalDate
没有。这是一个没有时间的日期,也没有utc的偏移量。这个Z
您要求的值表示与utc的偏移量为0。如果你想在输出中也包含小时、分钟和秒,你可以通过计算秒而不是天来实现。在这种情况下使用
OffsetDateTime
整个操作(或ZonedDateTime
如果在与utc不同的时区)。日期和时间:1996-09-21t06:49:56z
我正在使用
ThreadLocalRandom
因为它可以在指定的时间间隔内生成一个随机的长值。有趣的ThreadLocalRandom
有很多方便的方法Random
还没有。0aydgbwb2#
如果您想忽略时间部分,那么可以使用
ZonedDateTime
这样地:输出示例
或者更好,你可以用
toString
以字符串形式获取格式化日期,默认格式为ZonedDateTime
:输出
笔记
这个日期总是和你在一起
00:00:00
作为时间的一部分,因为我们正在使用LocalTime.MIN
此外,您还可以更改ZoneId
达到预期效果Zone
,这只是一个例子。重要的
DateFormat
以及SimpleDateFormat
是传统的图书馆,所以请不要把它们和java.time
图书馆,在你用的最上面LocalDate
也就是说你在用这个java.time
所以在你所有的代码中继续使用它。fhity93d3#
不要使用simpleDataFormat格式化java.time类型
使用
SimpleDateFormat
,您应该只格式化旧的日期时间类型,例如。java.util.Date
. 为了格式化java.time
日期时间类型,您需要使用DateTimeFormatter
.切勿将z括在单引号内
封闭是个错误
Z
在格式的单引号内。符号Z
代表zulu
并指定UTC+00:00
. 如果你把它括在单引号里,它只意味着字符文字,Z
不会起到UTC+00:00
正在解析。您不需要显式地使用格式化程序
对于这个需求,您不需要显式地使用格式化程序,因为
OffsetDateTime#toString
已经以您需要的格式返回字符串。但是,如果OffsetDateTime
对象为零,则相同且后续较小的单位被截断OffsetDateTime#toString
. 如果您需要完整的格式而不考虑秒的值,那么,当然,您必须使用DateTimeFormatter
.示例运行:
注意,api的日期时间
java.util
以及它们的格式化api,SimpleDateFormat
过时且容易出错。建议完全停止使用它们,并切换到现代日期时间api。出于任何原因,如果您必须坚持使用Java6或Java7,您可以使用threeten backport,它将大部分java.time功能向后移植到Java6和Java7。
如果您正在为一个android项目工作,并且您的android api级别仍然不符合java-8,请检查通过desugaring提供的java8+api以及如何在android项目中使用threetenabp。
从trail:date-time了解有关现代日期时间api的更多信息。
如果出于任何原因仍需要使用SimpleDataFormat:
转换
LocalDate
至ZonedDateTime
与ZoneOffset.UTC
在一天的开始➡️ 转换ZonedDateTime
至Instant
➡️ 获得java.util.Date
对象来自Instant
.