JSON响应中的格式化日期-仅显示1月?

时间:2018-10-09 19:55:08

标签: java android json date

我试图显示正确的日期,但是无论我做什么或日期如何,它都会将月份更改为1月。我在做什么错了?

  private static String formatDate(String dateFormat) {
    String jsonDate = "yyyy-mm-dd'T'HH:mm:ss'Z'";
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(jsonDate, Locale.getDefault());
    try {
        Date parsedDate = simpleDateFormat.parse(dateFormat);
        String parsedDatePattern = "MM dd y";
        SimpleDateFormat formatJsonDate = new SimpleDateFormat(parsedDatePattern, Locale.getDefault());

        return formatJsonDate.format(parsedDate);
    } catch (ParseException e) {
        Log.e(LOG_TAG, "~*&~*&~*&Error parsing JSON date: ", e);
        return "";
    }
}

1 个答案:

答案 0 :(得分:3)

tl; dr

Instant
.parse( "2018-01-23T01:23:45.123456789Z" )
.atZone( 
    ZoneId.of( "Africa/Tunis" )
)
.toLocalDate()
.format(
    DateTimeFormatter
    .ofLocalizedDate( FormatStyle.SHORT )
    .withLocale( Locale.US )
)
  

1/23/18

区分大小写

格式化模式区分大小写。

对于月份号,请使用所有大写的MM

另一个问题:您的格式化模式不明智地忽略了最后的Z。该字母提供了有价值的信息,指示UTC,偏移量为零。发音为“祖鲁语”。

java.time

您使用的是可怕的旧类,而这些旧类早在几年前就被 java.time 类所取代。

您的输入格式是标准的ISO 8601格式,默认在替换Instant的{​​{1}}类中使用。

java.util.Date

时区对于确定日期至关重要。在任何给定时刻,日期都会在全球范围内变化。例如,Paris France午夜之后的几分钟是新的一天,而Montréal Québec仍然是“昨天”。

Instant instant = Instant.parse( "2018-01-23T01:23:45.123456789Z" ) ; 的格式指定proper time zone name,例如America/MontrealAfrica/Casablancacontinent/region。切勿使用2-4个字母的缩写,例如Pacific/AucklandEST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

IST

提取仅日期部分,因为这是您问题的重点。

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
ZonedDateTime zdt = instant.atZone( z ) ;

以标准ISO 8601格式生成表示该日期的文本。

LocalDate ld = zdt.toLocalDate() ;

自动定位。

String output = ld.toString() ;

或者定义您自己的格式设置模式,如数十个(如果不是数百个)已发布的其他答案中所示。搜索Locale l = Locale.US ; // Or Locale.CANADA_FRENCH etc. DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( l ) ; String output ld.format( f ) ;


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

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

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要DateTimeFormatter.ofPattern类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore