java - 将字符串转换为人类可读的日期 (java/android)

标签 java android date

基于以下格式的输入字符串:"yyyyMMdd",例如"20170412",如何显示星期和日期?

例如:

input -> "20170412"

output -> "Wednesday, April 12th 2017""Wed Apr 12 2017" 或类似的东西

无论我尝试使用哪种模式 SimpleDateFormat ( https://stackoverflow.com/a/4216767/658323 ),我总是得到我不需要的时间和时区。

这可能吗?

编辑:我的问题不是重复。我在我的帖子中明确提到,可能重复的问题中列出的所有 SimpleDateFormat 模式都显示用户的时间和时区。我需要一个用户区域设置的日期模式,没有时间或时区。

最佳答案

tl;dr

LocalDate.parse(
    "20170412" ,
    DateTimeFormatter.BASIC_ISO_DATE
).format(
    DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL )
                     .withLocale( Locale.US )
)

Wednesday, April 12, 2017

使用java.time

现代方法是使用 java.time 类,特别是 LocalDateLocalDate类表示没有时间和时区的纯日期值。

定义格式模式以匹配您的输入。您的输入恰好符合 ISO 8601 的“基本”版本,其中分隔符的使用最少。为此,java.time 已经预定义了一种格式化模式。

DateTimeFormatter f = DateTimeFormatter.BASIC_ISO_DATE ;
LocalDate ld = LocalDate.parse( "20170412" , f );

要生成标准 ISO 8601 格式的字符串,请调用 toString。 java.time 类在解析/生成字符串时使用标准格式。

String output = ld.toString() ;

2017-04-12

一般来说,我建议您坚持使用 ISO 8601 格式的扩展版本,如上面的示例所示,它在日期中包含连字符,而不是基本版本。扩展版本更易于人类阅读,并且更易于识别为日期时间值。

本地化

您可以生成其他格式的字符串。如果需要,您可以指定确切的格式。但通常最好让 java.time 为您本地化。

要本地化,指定:

  • FormatStyle确定字符串的长度或缩写。
  • Locale确定 (a) 用于翻译日期名称、月份名称等的人类语言,以及 (b) 决定缩写、大写、标点符号、分隔符等问题的文化规范。

示例代码。

Locale l = Locale.CANADA_FRENCH ;  // Or Locale.US, Locale.ITALY, etc.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL )
                                       .withLocale( l ) ;
String output = ld.format( f ) ;

对于 Locale.US,输出为:

Wednesday, April 12, 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 类?

ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

关于java - 将字符串转换为人类可读的日期 (java/android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43376992/

相关文章:

date - 如何获取dll文件的编译日期?

java - 属性 android :forceQueryable not found in Android studio when running Espresso test

java - 如何将 Android View 绑定(bind)与 RecyclerView 结合使用

java - 获取某些字符串之间的数组或字符串列表(搜索多个字符串)

android - 如何知道api版本和android源码

android - 以编程方式创建多个 TextView

javascript - JQuery 中的生日选择器

python-3.x - 检查Python中的日期列是否在最近3个月的范围内

java - Hibernate:根据年龄对对象进行排序

java - 如何在 JTextPane 中删除选定的文本? (java)