使用 Java 以对象日历格式设置来自 ISO 8601 的当前日期
Setting current date from ISO 8601 in object Calendar format using Java
我正在尝试按以下方式设置 Calendar
日期对象,但我不知道如何设置。
public void setTradeDate(String tradeDate) {
Calendar tradeDate = ?
}
String
的格式为:
String tradeDate = "2017-06-01T15:49:18Z";
一个可能的解决方案是
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");
你可以使用 java-8 吗?
ZonedDateTime dateTime = ZonedDateTime.now();
System.out.println(DateTimeFormatter.ISO_INSTANT.format(dateTime));
阅读 SimpleDateFormat 的 javadoc。
'T'
将产生文字 T
。
X
将产生 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 之前不支持 X
7. 您可以使用 'Z'
来获取文字 Z
.
要从 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
的日期。请注意,此 date/time 是 UTC - 最后的 Z
是 UTC designator.
但是如果您尝试打印此日期(使用 System.out.println(cal.getTime())
、记录器,甚至在调试器中检查它的值),它会隐含地使用 toString()
方法,这会将字段(日、月、年、小时、分钟、秒等)转换为系统的默认时区(如果您的默认时区在印度,例如,日期将打印为 Thu Jun 01 21:19:18 IST 2017
,尽管内部值不会改变)。但是 value 仍然等同于 UTC 输入。
不要被 Calendar
和 Date
classes 的 toString()
方法的输出误导。重要的是时间戳的值:自 1970-01-01T00:00Z
以来的毫秒数,可以使用 cal.getTimeInMillis()
进行检查。查看 this article 了解更多信息。
当您使用 Java 7 时,还有另一种(更好的)选择:您可以使用 ThreeTen Backport,这是 Java 8 的新 date/time 的一个很好的反向移植classes.
您可以将输入解析为 org.threeten.bp.ZonedDateTime
并使用 org.threeten.bp.DateTimeUtils
class 将其转换为 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 and design issues。并使将来迁移到 Java 8 更容易,因为在新的 Java 8 API 中 classes 和方法名称相同,只是包不同(在Java 8 是 java.time
并且在 ThreeTen Backport 中是 org.threeten.bp
).
我正在尝试按以下方式设置 Calendar
日期对象,但我不知道如何设置。
public void setTradeDate(String tradeDate) {
Calendar tradeDate = ?
}
String
的格式为:
String tradeDate = "2017-06-01T15:49:18Z";
一个可能的解决方案是
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");
你可以使用 java-8 吗?
ZonedDateTime dateTime = ZonedDateTime.now();
System.out.println(DateTimeFormatter.ISO_INSTANT.format(dateTime));
阅读 SimpleDateFormat 的 javadoc。
'T'
将产生文字 T
。
X
将产生 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 之前不支持 X
7. 您可以使用 'Z'
来获取文字 Z
.
要从 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
的日期。请注意,此 date/time 是 UTC - 最后的 Z
是 UTC designator.
但是如果您尝试打印此日期(使用 System.out.println(cal.getTime())
、记录器,甚至在调试器中检查它的值),它会隐含地使用 toString()
方法,这会将字段(日、月、年、小时、分钟、秒等)转换为系统的默认时区(如果您的默认时区在印度,例如,日期将打印为 Thu Jun 01 21:19:18 IST 2017
,尽管内部值不会改变)。但是 value 仍然等同于 UTC 输入。
不要被 Calendar
和 Date
classes 的 toString()
方法的输出误导。重要的是时间戳的值:自 1970-01-01T00:00Z
以来的毫秒数,可以使用 cal.getTimeInMillis()
进行检查。查看 this article 了解更多信息。
当您使用 Java 7 时,还有另一种(更好的)选择:您可以使用 ThreeTen Backport,这是 Java 8 的新 date/time 的一个很好的反向移植classes.
您可以将输入解析为 org.threeten.bp.ZonedDateTime
并使用 org.threeten.bp.DateTimeUtils
class 将其转换为 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 and design issues。并使将来迁移到 Java 8 更容易,因为在新的 Java 8 API 中 classes 和方法名称相同,只是包不同(在Java 8 是 java.time
并且在 ThreeTen Backport 中是 org.threeten.bp
).