这里有很多关于SimpleDateFormat的问题,但我似乎无法在这个问题上找到任何东西。我遇到了与Android和JDK上运行的完全相同的代码不同输出的问题。我在Eclipse中运行并使用模拟器来测试Android。 JDK版本1.7和Android 4.4。
有关如何以JDK样式格式制作Android输出的任何想法?
TimeZone GMT_ZONE = TimeZone.getTimeZone("GMT");
String RFC1123_PATTERN = "EEE, dd MMM yyyy HH:mm:ss z";
final DateFormat rfc1123Format = new SimpleDateFormat(RFC1123_PATTERN, LOCALE_US);
rfc1123Format.setTimeZone(GMT_ZONE);
String dateString = rfc1123Format.format(new Date());
JDK 1.7 dateString值:星期五,2013年12月20日00:46:21 GMT
Android 4.4 dateString值:星期五,2013年12月20日00:46:21 GMT + 00:00
答案 0 :(得分:4)
Android库是对Java库的模仿,但不是精确的副本。因此the lawsuit between Oracle and Google。所以你可能会看到行为的变化。
如果您希望在使用日期时间时获得一致且出色的体验,请使用第三方开源Joda-Time库。 Joda-Time旨在取代臭名昭着的java.util.Date/Calendar类。
另一个选项可能是与Java 8捆绑在一起的JSR 310: Date and Time API java.time。*类的Java 7 backport。
关于后续问题,您添加了评论:
知道什么模式会产生Android上的Fri,2013年12月20日00:46:21 GMT格式输出?
令人惊讶的是,Joda-Time 2.3似乎缺少旧版RFC 1123格式的内置格式化程序。但是,如果你记得将DateTime转换为UTC,那么下面的home-brew格式似乎可以完成这项工作,如下所示。
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;
DateTime nowInParis = new DateTime( DateTimeZone.forID( "Europe/Paris" ) );
DateTimeFormatter formatter = DateTimeFormat.forPattern("E, d MMM yyyy HH:mm:ss 'GMT'").withLocale( Locale.US );
String nowInParisAsStringGMT = formatter.print( nowInParis.toDateTime( DateTimeZone.UTC ) );
转储到控制台...
System.out.println( "nowInParisAsStringGMT: " + nowInParisAsStringGMT );
System.out.println( "nowInParis: " + nowInParis );
跑步时......
nowInParisAsStringGMT: Fri, 20 Dec 2013 05:03:58 GMT
nowInParis: 2013-12-20T05:03:58.175+01:00
答案 1 :(得分:0)
对于那些不想使用Joda-Time的人来说,这是Basil的答案的略微修改版本:
private String toRfc1123(Date date) {
SimpleDateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
return formatter.format(date);
}