显然你的一端出了问题。
这是我的代码版本。使用Java 8更新45.
try {
String input = "2015-06-20T01:57:13Z";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
java.util.Date date = sdf.parse(input);
long millisSinceEpoch = date.getTime();
System.out.println("millis: " + millisSinceEpoch);
} catch (ParseException ex) {
// Handle exception
}
运行时。
millis: 1434765433000
我收到了您的预期结果。
也许这个问题与你的SimpleDateFormat实例的不正确使用相关,如同静态一样,正如其他评论和答案中指出的一样。
顺便说一句,java.util.Date/.Calendar类是非常麻烦的。他们现在是由两种取代:
这两个框架默认支持输入字符串的ISO 8601格式。
而这两个框架都将时区分配给它们各自的日期 - 时间对象。
Joda-Time
这是代码Joda-Time 2.8.1。搜索StackOverflow了解更多示例和讨论。
String input = "2015-06-20T01:57:13Z";
DateTimeZone zone = DateTimeZone.forID("Asia/Kolkata");
DateTime dateTimeKolkata = new DateTime(input , zone);
DateTime dateTimeUtc = dateTimeKolkata.withZone(DateTimeZone.UTC);
long millisSinceEpoch = dateTimeKolkata.getMillis();
转储到控制台。
System.out.println("dateTimeKolkata: " + dateTimeKolkata);
System.out.println("dateTimeUtc: " + dateTimeUtc);
System.out.println("millisSinceEpoch: " + millisSinceEpoch);
运行时。
dateTimeKolkata: 2015-06-20T07:27:13.000+05:30
dateTimeUtc: 2015-06-20T01:57:13.000Z
millisSinceEpoch: 1434765433000
java.time
代码java.time将在概念上面看到的乔达,时间码类似,不同之处在于java.time使用工厂方法,而不是“新”的构造。
查看此问题的Parse ISO timestamp using Java 8 java.time api (standard edition only)代码示例。
避免计数纪元以来
我建议避免(在你的情况毫秒)直接与计数从历元的工作只要有可能。使用体面的日期时间框架并坚持其智能对象。你是否使用原始字节数组而不是String
实例处理文本?相同的逻辑适用于日期时间值。
它使用机器时间,如果你不建立一个区域 –