,而不是与SimpleDateFormat
直接合作(在这种老的API有lots of problems和design issues),你可以使用ThreeTen Backport,对Java 8的新的日期/时间类有很大反向移植。要在Android中使用它,您还需要ThreeTenABP(有关如何使用它的更多信息,请参阅here)。
要使用的主要类是org.threeten.bp.ZonedDateTime
(可以解析日期/时间输入)和org.threeten.bp.format.DateTimeFormatter
(用于控制输出格式)。
如果你正在阅读这个领域(2017-06-22T16:18:04Z
)为String
,你可以创建一个ZonedDateTime
这样的:
ZonedDateTime z = ZonedDateTime.parse("2017-06-22T16:18:04Z");
如果你已经有了一个java.util.Date
对象,你可以使用org.threeten.bp.DateTimeUtils
与org.threeten.bp.ZoneOffset
转换它:
Date date = // get java.util.Date
ZonedDateTime z = DateTimeUtils.toInstant(date).atZone(ZoneOffset.UTC);
在结束时,ZonedDateTime
对象将具有webPublicationDate
值。
要获得不同的输出格式,只需为每种格式创建一个DateTimeFormatter
即可。在下面的例子中,我也用java.util.Locale
类,以确保月份名称都是英文:
// for Mar 3, 1984
DateTimeFormatter f1 = DateTimeFormatter.ofPattern("MMM d, yyyy", Locale.ENGLISH);
// for 4:40 PM
DateTimeFormatter f2 = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH);
// for 16:18
DateTimeFormatter f3 = DateTimeFormatter.ofPattern("HH:mm", Locale.ENGLISH);
System.out.println(f1.format(z)); // Jun 22, 2017
System.out.println(f2.format(z)); // 4:18 PM
System.out.println(f3.format(z)); // 16:18
输出是:
2017年6月22日
下午4时18
16 :18
请注意,它使用UTC时区(Z
在2017-06-22T16:18:04Z
)。如果你想显示在另一个时区的日期和时间,只需使用org.threeten.bp.ZoneId
类:
System.out.println(f3.format(z.withZoneSameInstant(ZoneId.of("Europe/London")))); // 17:18
输出是17:18
(becase的伦敦夏季时间了)。
请注意,API使用IANA timezones names(始终格式为Continent/City
,如America/Sao_Paulo
或Europe/Berlin
)。 避免使用3字母缩写(如CST
或),因为它们是ambiguous and not standard。要找到更适合每个地区的时区,请使用ZoneId.getAvailableZoneIds()
方法,并检查哪一个最适合您的用例。
如果你不希望其他依赖添加到您的项目并使用SimpleDateFormat
,你做同样的事情(创建一个解析器和3输出格式化,并使用英语语言环境)。另外不要忘记设置时区 - 我在下面使用UTC,但您可以将其更改为您想要的任何时区。
// parse date
String dateInString = "2017-06-22T16:18:04Z";
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
Date date = parser.parse(dateInString);
// create output formatters (set timezone to UTC)
TimeZone utc = TimeZone.getTimeZone("UTC");
SimpleDateFormat s1 = new SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH);
s1.setTimeZone(utc);
SimpleDateFormat s2 = new SimpleDateFormat("h:mm a", Locale.ENGLISH);
s2.setTimeZone(utc);
SimpleDateFormat s3 = new SimpleDateFormat("HH:mm", Locale.ENGLISH);
s3.setTimeZone(utc);
System.out.println(s1.format(date));
System.out.println(s2.format(date));
System.out.println(s3.format(date));
的输出将是相同的:
2017年6月22日
下午4点18
16:18
而且重复的:https://开头计算器。 com/q/2201925和https://stackoverflow.com/q/31090946 –