要从String 创建Calendar,您可以使用SimpleDateFormat(正如其他答案已经建议的那样)。格式化程序将解析String 并创建一个Date 对象,该对象将设置为Calendar:
String tradeDate = "2017-06-01T15:49:18Z";
// create Calendar
Calendar cal = Calendar.getInstance();
// create formatter
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
// parse string and set the resulting date to Calendar
cal.setTime(df.parse(tradeDate));
Calendar 将包含等同于2017-06-01T15:49:18Z 的日期。请注意,此日期/时间是 UTC - 最后的 Z 是 UTC designator。
但是,如果您尝试打印此日期(使用 System.out.println(cal.getTime())、记录器,甚至在调试器中检查其值),它将隐式使用 toString() 方法,这将转换字段 (日、月、年、小时、分钟、秒等)到系统的默认时区(例如,如果您的默认时区在印度,则日期将打印为Thu Jun 01 21:19:18 IST 2017,尽管内部值不会更改)。但 值 仍将等同于 UTC 输入。
不要被Calendar 和Date 类的toString() 方法的输出误导。重要的是时间戳的值:自1970-01-01T00:00Z 以来的毫秒数,可以使用cal.getTimeInMillis() 检查。更多信息请查看this article。
当您使用 Java 7 时,还有另一个(更好的)替代方案:您可以使用 ThreeTen Backport,这是 Java 8 新日期/时间类的一个很好的向后移植。
您可以将输入解析为org.threeten.bp.ZonedDateTime,并使用org.threeten.bp.DateTimeUtils 类将其转换为java.util.Calendar:
String tradeDate = "2017-06-01T15:49:18Z";
// parse input
ZonedDateTime zdt = ZonedDateTime.parse(tradeDate);
// convert to calendar
Calendar cal = DateTimeUtils.toGregorianCalendar(zdt);
使用此反向移植可消除旧的 Calendar API 的 lots of problems 和 design issues。并且使将来向 Java 8 的迁移变得更加容易,因为在新的 Java 8 API 中,类和方法名称是相同的,只是包不同(在 Java 8 中是 java.time,而在 ThreeTen Backport 中是 org.threeten.bp)。