我试图通过Calendar
以下方式设置日期对象,但我不知道如何。
public void setTradeDate(String tradeDate) {
Calendar tradeDate = ?
}
String
格式为:
String tradeDate = "2017-06-01T15:49:18Z";
我试图通过Calendar
以下方式设置日期对象,但我不知道如何。
public void setTradeDate(String tradeDate) {
Calendar tradeDate = ?
}
String
格式为:
String tradeDate = "2017-06-01T15:49:18Z";
你可以使用java-8吗?
ZonedDateTime dateTime = ZonedDateTime.now();
System.out.println(DateTimeFormatter.ISO_INSTANT.format(dateTime));
要从 a 创建 a Calendar
,String
您可以使用 a 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 指示符。
但是,如果您尝试打印此日期(使用System.out.println(cal.getTime())
,记录器,甚至在调试器中检查其值),它将隐式使用该toString()
方法,这将转换字段(日,月,年,小时,分钟,秒,等)到系统的默认时区(例如,如果您的默认时区在印度,则日期将打印为Thu Jun 01 21:19:18 IST 2017
,尽管内部值不会更改)。但该值仍将等同于 UTC 输入。
不要被toString()
方法 fromCalendar
和Date
classes 的输出误导。重要的是时间戳的值:从 开始的毫秒数1970-01-01T00:00Z
,可以用 来检查cal.getTimeInMillis()
。查看这篇文章了解更多信息。
当您使用 Java 7 时,还有另一个(更好的)替代方案:您可以使用ThreeTen Backport,它是 Java 8 新日期/时间类的一个很好的向后端口。
您可以将输入解析为 aorg.threeten.bp.ZonedDateTime
并使用org.threeten.bp.DateTimeUtils
该类将其转换为 a 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 消除了旧API的许多问题和设计问题。Calendar
并且使将来向 Java 8 的迁移变得更加容易,因为在新的 Java 8 API 中,类和方法名称是相同的,只是包不同(在 Java 8 中是java.time
,而在 ThreeTen Backport 中是org.threeten.bp
)。
阅读SimpleDateFormat的 javadoc 。
'T'
将产生一个文字T
.
X
将产生一个ISO 8601 时区(Z
在 UTC 时区的情况下)。
因此,您可以通过以下方式实现:
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()));
在X
Java 7 之前不支持 . 您可以'Z'
改为使用Z
.
一个可能的解决方案是
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");