获得ISO 8601格式的当前时刻UTC的最优雅的方式是什么?它看起来应该像:2010-10-12 t8: 50z。

例子:

String d = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);

当前回答

我在Android中使用Calendar和SimpleDateFormat。下面的方法返回一个带有“GMT”时区的日历(这是通用时区)。然后,您可以使用Calendar类的setTimeZone()方法在不同的时区之间设置小时。

private static final String GMT = "GMT";
private static final String DATE_FORMAT_ISO = "yyyyMMdd'T'HHmmss";

public static Calendar isoToCalendar(final String inputDate) {
    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(GMT));
    try {
        SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_ISO, Locale.US);
        dateFormat.setTimeZone(TimeZone.getTimeZone(GMT));
        Date date = dateFormat.parse(inputDate);
        calendar.setTime(date);
    } catch (ParseException e) {
        Log.e("TAG",e.getMessage());
    }
    return calendar;
}

记住: Date类不知道TimeZone的存在。因此,如果调试一个日期,总是会看到当前时区的日期。

其他回答

DateTimeFormatter.ISO_DATE_TIME
        .withZone(ZoneOffset.UTC)
        .format(yourDateObject.toInstant())

不过,joda-time只支持扩展格式: “2015 - 12 - 09 - t00:22:42.930z” 不是最基本的: “20151209 t002242.930z” …我们最好使用java SimpleDateFormat测试一个格式列表。

对于默认时区不是UTC的系统:

TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());

如果经常需要,可以将SimpleDateFormat实例声明为全局常量,但要注意该类不是线程安全的。如果被多个线程并发访问,则必须进行同步。

编辑:我更喜欢Joda时间,如果做许多不同的时间/日期操作… EDIT2:更正:setTimeZone不接受字符串(由Paul更正)

对于ISO 8601,您可以使用Java的SimpleDateFormat,格式如下:yyyy-MM-dd'T'HH:mm:ssXXX。

示例代码:(列出所有可用的时区)

for (String timeZone : TimeZone.getAvailableIDs())
{
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
    dateFormat.setTimeZone(TimeZone.getTimeZone(timeZone));
    String formatted = dateFormat.format(new Date());
    System.out.print(formatted);

    if (formatted.endsWith("Z"))
    {
        // These time zone's have offset of '0' from GMT.
        System.out.print("\t(" + timeZone + ")");
    }

    System.out.println();
}

你可以用:

TimeZone.getDefault()

虚拟机默认时区。更多的在这里

你可能会注意到,很少有时区的日期时间是以Z结尾的。这些时区与GMT的偏移量为“0”。

更多信息可以在这里找到。

Apache common -lang3中的DateFormatUtils有一些有用的常量,例如:ISO_DATETIME_FORMAT