将Java日期转换为UTC字符串

该java.util.Date

toString()方法显示当地时区的日期。

在几种常见的情况下,我们希望以UTC格式打印数据,包括日志,数据导出以及与外部程序的通信。

  • java.util.Date在UTC中创建String表示形式的最佳方法是什么?
  • 如何用更好的toString()格式替换无法排序的juDate 格式(感谢@JonSkeet!)?

附录

我认为以自定义格式和时区打印日期的标准方法非常繁琐:

final Date date = new Date();

final String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS zzz";

final SimpleDateFormat sdf = new SimpleDateFormat(ISO_FORMAT);

final TimeZone utc = TimeZone.getTimeZone("UTC");

sdf.setTimeZone(utc);

System.out.println(sdf.format(date));

我一直在寻找像这样的单线:

System.out.println(prettyPrint(date, "yyyy-MM-dd'T'HH:mm:ss.SSS zzz", "UTC"));

回答:

遵循有用的注释,我已经完全重建了日期格式化程序。用法应该是:

  • 短(一根衬里)
  • 用字符串表示一次性对象(时区,格式)
  • 支持有用的,可排序的ISO格式以及包装盒中的旧格式

如果您认为此代码有用,则可以在github中发布源代码和JAR。

用法

// The problem - not UTC

Date.toString()

"Tue Jul 03 14:54:24 IDT 2012"

// ISO format, now

PrettyDate.now()

"2012-07-03T11:54:24.256 UTC"

// ISO format, specific date

PrettyDate.toString(new Date())

"2012-07-03T11:54:24.256 UTC"

// Legacy format, specific date

PrettyDate.toLegacyString(new Date())

"Tue Jul 03 11:54:24 UTC 2012"

// ISO, specific date and time zone

PrettyDate.toString(moonLandingDate, "yyyy-MM-dd hh:mm:ss zzz", "CST")

"1969-07-20 03:17:40 CDT"

// Specific format and date

PrettyDate.toString(moonLandingDate, "yyyy-MM-dd")

"1969-07-20"

// ISO, specific date

PrettyDate.toString(moonLandingDate)

"1969-07-20T20:17:40.234 UTC"

// Legacy, specific date

PrettyDate.toLegacyString(moonLandingDate)

"Wed Jul 20 08:17:40 UTC 1969"

(此代码也是 有关Code Review

stackexchange的问题的主题)

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.TimeZone;

/**

* Formats dates to sortable UTC strings in compliance with ISO-8601.

*

* @author Adam Matan <adam@matan.name>

* @see http://stackoverflow.com/questions/11294307/convert-java-date-to-utc-string/11294308

*/

public class PrettyDate {

public static String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS zzz";

public static String LEGACY_FORMAT = "EEE MMM dd hh:mm:ss zzz yyyy";

private static final TimeZone utc = TimeZone.getTimeZone("UTC");

private static final SimpleDateFormat legacyFormatter = new SimpleDateFormat(LEGACY_FORMAT);

private static final SimpleDateFormat isoFormatter = new SimpleDateFormat(ISO_FORMAT);

static {

legacyFormatter.setTimeZone(utc);

isoFormatter.setTimeZone(utc);

}

/**

* Formats the current time in a sortable ISO-8601 UTC format.

*

* @return Current time in ISO-8601 format, e.g. :

* "2012-07-03T07:59:09.206 UTC"

*/

public static String now() {

return PrettyDate.toString(new Date());

}

/**

* Formats a given date in a sortable ISO-8601 UTC format.

*

* <pre>

* <code>

* final Calendar moonLandingCalendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));

* moonLandingCalendar.set(1969, 7, 20, 20, 18, 0);

* final Date moonLandingDate = moonLandingCalendar.getTime();

* System.out.println("UTCDate.toString moon: " + PrettyDate.toString(moonLandingDate));

* >>> UTCDate.toString moon: 1969-08-20T20:18:00.209 UTC

* </code>

* </pre>

*

* @param date

* Valid Date object.

* @return The given date in ISO-8601 format.

*

*/

public static String toString(final Date date) {

return isoFormatter.format(date);

}

/**

* Formats a given date in the standard Java Date.toString(), using UTC

* instead of locale time zone.

*

* <pre>

* <code>

* System.out.println(UTCDate.toLegacyString(new Date()));

* >>> "Tue Jul 03 07:33:57 UTC 2012"

* </code>

* </pre>

*

* @param date

* Valid Date object.

* @return The given date in Legacy Date.toString() format, e.g.

* "Tue Jul 03 09:34:17 IDT 2012"

*/

public static String toLegacyString(final Date date) {

return legacyFormatter.format(date);

}

/**

* Formats a date in any given format at UTC.

*

* <pre>

* <code>

* final Calendar moonLandingCalendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));

* moonLandingCalendar.set(1969, 7, 20, 20, 17, 40);

* final Date moonLandingDate = moonLandingCalendar.getTime();

* PrettyDate.toString(moonLandingDate, "yyyy-MM-dd")

* >>> "1969-08-20"

* </code>

* </pre>

*

*

* @param date

* Valid Date object.

* @param format

* String representation of the format, e.g. "yyyy-MM-dd"

* @return The given date formatted in the given format.

*/

public static String toString(final Date date, final String format) {

return toString(date, format, "UTC");

}

/**

* Formats a date at any given format String, at any given Timezone String.

*

*

* @param date

* Valid Date object

* @param format

* String representation of the format, e.g. "yyyy-MM-dd HH:mm"

* @param timezone

* String representation of the time zone, e.g. "CST"

* @return The formatted date in the given time zone.

*/

public static String toString(final Date date, final String format, final String timezone) {

final TimeZone tz = TimeZone.getTimeZone(timezone);

final SimpleDateFormat formatter = new SimpleDateFormat(format);

formatter.setTimeZone(tz);

return formatter.format(date);

}

}

以上是 将Java日期转换为UTC字符串 的全部内容, 来源链接: utcz.com/qa/417831.html

回到顶部