【问题标题】:Setting current date from ISO 8601 in object Calendar format using Java [duplicate]使用Java以对象日历格式从ISO 8601设置当前日期[重复]
【发布时间】:2018-01-25 18:21:07
【问题描述】:

我正在尝试通过以下方式设置 Calendar 日期对象,但我不知道如何。

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

String 的格式为:

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

【问题讨论】:

  • @Jotunacorn,我需要日历格式。
  • 我不明白 日历格式 可能是什么。你想获取String 还是Calendar 对象?
  • @Thomas Calendar 对象。
  • @ThomasFritsch,更新了我的问题。我想这让你感到困惑。
  • 你把所有人都搞糊涂了。这已经过时了迄今为止给出的所有 3 个答案。

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


【解决方案1】:

要从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 - 最后的 ZUTC designator

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

不要被CalendarDate 类的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 problemsdesign issues。并且使将来向 Java 8 的迁移变得更加容易,因为在新的 Java 8 API 中,类和方法名称是相同的,只是包不同(在 Java 8 中是 java.time,而在 ThreeTen Backport 中是 org.threeten.bp)。

【讨论】:

    【解决方案2】:

    你会用 java-8 吗?

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

    【讨论】:

    • 我正在使用 Java 7.. :( \
    • @Syed,你能在你的项目中使用joda.org/joda-time吗?
    • 安东,我应该得到日历日期对象。
    • 来自您的链接 @AntonBalaniuc 的引述:“现在要求用户迁移到 java.time (JSR-310)。” “请注意,Joda-Time 被认为是一个基本上“完成”的项目。没有计划进行重大改进。如果使用 Java SE 8,请迁移到 java.time (JSR-310)。”虽然 Joda-Time 是可行的,但我认为 ThreeTen Backport,建议 by Hugo 更好。
    【解决方案3】:

    阅读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

    【讨论】:

    • 同样是 Dateformat 返回类型。如何仅获取日历对象类型。因为我需要设置日历对象
    • 这是我的方法签名,它需要日历对象。公共无效 setTradeDate(java.util.Calendar tradeDate) { }
    • 其实X就是supported in Java 7。不过是not supported in Java 6
    • 谢谢@Hugo,我更新了我的答案。
    【解决方案4】:

    一个可能的解决方案是

    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.
    }
    

    通过调用来使用它

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

    【讨论】:

    • 我需要日历返回类型。请阅读我的问题
    • 我已阅读您的问题,据我了解,当前 System.out.println(df.format(calobj.getTime()));以错误的格式打印。解决方案是按照我的指示更改格式。 “我需要日历返回类型”是什么意思?
    • public void setTradeDate(java.util.Calendar tradeDate) { }.. 我的方法采用该格式的日历对象。
    • DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); System.out.println(df.format(tradeDate.getTime()))
    • 请再次测试您的代码。有 parseException
    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 2019-02-19
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多