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

例子:

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

当前回答

如果您不想包含Jodatime(尽管它很好)

javax.xml.bind.DatatypeConverter.printDateTime(
    Calendar.getInstance(TimeZone.getTimeZone("UTC"))
);

返回一个字符串:

2012-07-10T16:02:48.440Z

这与原始请求略有不同,但仍然是ISO-8601。

其他回答

我在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的存在。因此,如果调试一个日期,总是会看到当前时区的日期。

使用JodaTime

ISO 8601日历系统是Joda-Time中的默认实现

下面是JodaTime Formatter的文档

编辑:

如果你不想添加或者如果你看不到添加以上库的价值,你可以使用内置SimpleDateFormat类将日期格式化为所需的ISO格式

正如@Joachim Sauer所建议的

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
String nowAsString = df.format(new Date());

对于那些使用Joda Time的人,这里有一个格式为yyyy-MM-dd' t ' hh:mm:ss' z '的一行代码

DateTime(timeInMillis, DateTimeZone.UTC).toString(ISODateTimeFormat.dateTimeNoMillis())

如果您不想包含Jodatime(尽管它很好)

javax.xml.bind.DatatypeConverter.printDateTime(
    Calendar.getInstance(TimeZone.getTimeZone("UTC"))
);

返回一个字符串:

2012-07-10T16:02:48.440Z

这与原始请求略有不同,但仍然是ISO-8601。

这里优化了整个类,以便调用“now()”不做任何它必须做的事情。

public class Iso8601Util
{
    private static TimeZone tz = TimeZone.getTimeZone("UTC");
    private static DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");

    static
    {
        df.setTimeZone(tz);
    }

    public static String now()
    {
        return df.format(new Date());
    }
}