我试图显示正确的日期,但是无论我做什么或日期如何,它都会将月份更改为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 "";
}
}
答案 0 :(得分:3)
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 类所取代。
您的输入格式是标准的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/Montreal
,Africa/Casablanca
或continent/region
。切勿使用2-4个字母的缩写,例如Pacific/Auckland
或EST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。