tl;博士
使用 java.time 类。
Instant.ofEpochSecond( 1_485_748_890L )
.atZone( ZoneId.of( "America/Montreal" ) )
.toLocalDate()
.format(
DateTimeFormatter.ofPattern ( "dd-MM-uuuu" )
.withLocale ( Locale.UK )
)
29-01-2017
乔达时间
如果您想要一个没有时间的仅日期值,您应该使用org.joda.time.LocalDate 类。
仅供参考,Joda-Time 项目现在位于maintenance mode,团队建议迁移到java.time 类。大部分 java.time 都向后移植到 Java 6、Java 7 和 Android(见下文)。
java.time
LocalDate 类表示没有时间和时区的仅日期值。
LocalDate birthdate = LocalDate.of( 1994 , 5 , 10 );
如果您的输入是自 1970 年 UTC 第一时刻 (1970-01-01T00:00:00Z) 以来的整秒数,请转换为 Instant。 Instant 类代表UTC 时间线上的时刻,分辨率为nanoseconds(最多九 (9) 位小数)。
Instant instant = Instant.ofEpochSecond( 1_485_748_890L );
要通过特定地区的wall-clock time 的镜头观看这一刻,请指定一个时区 (ZoneId) 以获取ZonedDateTime。
时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,Paris France 中午夜过后几分钟是新的一天,而 Montréal Québec 中仍然是“昨天”。
以continent/region 的格式指定proper time zone name,例如America/Montreal、Africa/Casablanca 或Pacific/Auckland。切勿使用 3-4 个字母的缩写,例如 EST 或 IST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
LocalDate 类表示没有时间和时区的仅日期值。
LocalDate ld = zdt.toLocalDate();
要生成表示对象值的字符串,请调用 toString 以获取标准 ISO 8601 格式 YYYY-MM-DD 的字符串。
ld.toString(): 2017-01-29
对于其他格式,请使用 DateTimeFormatter 类。您可以指定格式模式,或让类自动本地化。
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "dd-MM-uuuu" ).withLocale ( Locale.UK );
String output = ld.format ( f );
instant.toString(): 2017-01-30T04:01:30Z
zdt.toString(): 2017-01-29T23:01:30-05:00[美国/蒙特利尔]
ld.toString(): 2017-01-29
输出:29-01-2017
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?