使用Java以对象日历格式设置ISO 8601的当前日期

时间:2017-08-17 11:01:33

标签: java calendar datetime-parsing java.util.calendar

我试图以下列方式设置Calendar日期对象,但我不知道如何。

public void setTradeDate(String tradeDate) {
    Calendar tradeDate = ?
}

String的格式为:

String tradeDate = "2017-06-01T15:49:18Z";

4 个答案:

答案 0 :(得分:1)

你能使用java-8吗?

ZonedDateTime dateTime = ZonedDateTime.now();
System.out.println(DateTimeFormatter.ISO_INSTANT.format(dateTime));

答案 1 :(得分:1)

要从Calendar创建String,您可以使用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为单位 - 最后ZUTC designator

但是如果你尝试打印这个日期(使用System.out.println(cal.getTime()),一个记录器,甚至在调试器中检查它的值),它就会使用toString()方法,这就是将字段(日,月,年,小时,分钟,秒等)转换为系统的默认时区(例如,如果您的默认时区位于印度,则日期将打印为Thu Jun 01 21:19:18 IST 2017,尽管内部价值不会改变)。但仍将等同于UTC输入。

不要被来自toString()Calendar类的Date方法的输出误导。重要的是时间戳的值:自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);

使用此backport会消除旧Calendar API的lots of problemsdesign issues。并且使将来迁移到Java 8变得更加容易,因为在新的Java 8 API中,类和方法名称是相同的,只是包是不同的(在Java 8中是java.time而在ThreeTen Backport中是{{1} })。

答案 2 :(得分:0)

阅读SimpleDateFormat的javadoc 'T'会产生一个文字TX将生成 ISO 8601时区(如果是UTC时区,则为Z。)
所以你可以通过以下方式实现它:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
df.setTimeZone(TimeZone.getTimeZone("UTC"));
Calendar calobj = Calendar.getInstance();
System.out.println(df.format(calobj.getTime()));

Java 7之前不支持X。您可以使用'Z'来获取文字Z

答案 3 :(得分:-1)

可能的解决方案是

public void setTradeDate(String tradeDate) {
    Calendar cal = Calendar.getInstance();
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
    try {
        cal.setTime(df.parse(tradeDate));
    } catch(ParseException e) {
        //Handle exception
    }
    System.out.println(cal); //Change to setting the field instead.
}

通过callling

使用它
setTradeDate("2017-06-01T15:49:18Z");