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

ste*_*osf 2 java android date

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

例如:

input -> "20170412"
Run Code Online (Sandbox Code Playgroud)

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

无论我尝试使用哪种模式SimpleDateFormat(/sf/answers/295173721/),我总能得到我不需要的时间和时区.

那可能吗?

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

Emi*_*ter 5

如果我正确理解你的问题:似乎你需要不同的格式来从字符串到日期阅读和不同的显示.试试这个

    String string = "20170412";
    DateFormat readFormat = new SimpleDateFormat("yyyyMMdd");
    Date date = readFormat.parse(string);

    DateFormat displayFormat = new SimpleDateFormat("E MMMM d, yyyy", Locale.ENGLISH);
    System.out.println(displayFormat.format(date));
Run Code Online (Sandbox Code Playgroud)

但通常你应该尊重用户为系统选择的日期格式.所以每个应用程序都会有相同的显示日期格式:在这篇文章中如何在Android中获取用户选择的日期格式?


Bas*_*que 5

tl; dr

LocalDate.parse(
    "20170412" ,
    DateTimeFormatter.BASIC_ISO_DATE
).format(
    DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL )
                     .withLocale( Locale.US )
)
Run Code Online (Sandbox Code Playgroud)

2017年4月12日星期三

使用java.time

具体来说,现代方法是使用java.time类LocalDate。该LocalDate级表示没有时间一天和不同时区的日期,唯一的价值。

定义格式设置以匹配您的输入。您输入的内容恰好符合ISO 8601的“基本”版本,在该版本中,分隔符的使用已减至最少。为此,java.time已经预定义了格式设置模式。

DateTimeFormatter f = DateTimeFormatter.BASIC_ISO_DATE ;
LocalDate ld = LocalDate.parse( "20170412" , f );
Run Code Online (Sandbox Code Playgroud)

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

String output = ld.toString() ;
Run Code Online (Sandbox Code Playgroud)

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 ) ;
Run Code Online (Sandbox Code Playgroud)

对于Locale.US该输出将是:

2017年4月12日星期三


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar,和SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

在哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多