Java:HTTP格式的时间(以毫秒为单位)?

Ric*_*kwa 3 java date http

我有一个File对象,我希望将该文件的最后修改日期转换为HTTP格式.格式是GMT时间,如:

Mon, 10 Feb 2014 16:17:37 GMT
Run Code Online (Sandbox Code Playgroud)

我知道java.io.File有一个lastModified()以毫秒为单位返回时间的方法.我也可以在毫秒内将该时间传递给java.util.Date类的构造函数.但是以HTTP格式获取字符串的最简单方法是什么?

谢谢.

Men*_*ild 5

SimpleDateFormat sdf = 
  new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
String httpDate = sdf.format(new Date(file.lastModified()));
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 5

java.time

\n

请阅读以下Joda-Time部分了解详细信息。Joda -Time项目现在处于维护模式,建议迁移到java.time类。

\n

该类表示UTCInstant时间线上的时刻,分辨率为纳秒(最多九 (9) 位小数)。

\n
long milliseconds = \xe2\x80\xa6 ; \nInstant instant = Instant.ofEpochMilli( milliseconds );  // Or use Instant.now() to experiment.\n
Run Code Online (Sandbox Code Playgroud)\n

如需格式化,请转换为OffsetDateTime.

\n
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );\n
Run Code Online (Sandbox Code Playgroud)\n

该类为您所需的格式DateTimeFormatter提供了现成的格式化程序该格式由RFC 1123标准定义。

\n
String output = odt.format ( DateTimeFormatter.RFC_1123_DATE_TIME );\n
Run Code Online (Sandbox Code Playgroud)\n
\n

2017 年 1 月 11 日星期三 21:35:19 GMT

\n
\n

对于其他格式化程序,我会说始终指定Locale. 但 RFC 1123 的特定格式化程序根据 RFC 要求硬编码为英语。因此指定 aLocale对输出没有影响。

\n
\n

乔达时间

\n

只是为了好玩,这里有来自Meno Hochschild 正确答案的相同类型的代码,但使用的是Joda-Time 2.3 库。

\n

一些注释\xe2\x80\xa6

\n
    \n
  • 在日期时间工作中,毫秒数必须为非longint64 位与 32 位)。
  • \n
  • HTTP 规范要求使用英文作为日期和月份的名称。因此,我们应该明确指定英语,以防我们的代码在英语不是默认语言环境的 JVM 上运行。
  • \n
\n

示例代码

\n
 // Note how the variable for milliseconds is a "long" not "int".\nlong milliseconds = DateTime.now().getMillis(); // Get milliseconds from java.io.File method "lastModified", or wherever.\n\nDateTime dateTime = new DateTime( milliseconds, DateTimeZone.UTC );\nDateTimeFormatter formatter = DateTimeFormat.forPattern( "EEE, dd MMM yyyy HH:mm:ss \'GMT\'" ).withZone( DateTimeZone.UTC ).withLocale( java.util.Locale.ENGLISH );\n\nString httpDateTime = formatter.print( dateTime );\n
Run Code Online (Sandbox Code Playgroud)\n

转储到控制台\xe2\x80\xa6

\n
System.out.println( "milliseconds: " + milliseconds );\nSystem.out.println( "dateTime: " + dateTime );\nSystem.out.println( "httpDateTime: " + httpDateTime );\n
Run Code Online (Sandbox Code Playgroud)\n

当运行\xe2\x80\xa6时

\n
long milliseconds = \xe2\x80\xa6 ; \nInstant instant = Instant.ofEpochMilli( milliseconds );  // Or use Instant.now() to experiment.\n
Run Code Online (Sandbox Code Playgroud)\n

ISO 8601

\n

HTTP 1.1 规范确实需要该格式。所以如果你需要它,就使用它。但要知道,互联网社区已在很大程度上转向对当前一代协议使用更合理的ISO 8601格式。ISO 格式为YYYY-MM-DDTHH:MM:SS.ssssss+00:00,如上面输出的第二行所示。Joda-Time 库使用 ISO 8601 作为大多数用途的默认值。

\n