在Java中以HTTP格式获取日期

Fer*_*mac 44 java time date http

我正在尝试以HTTP 1.1中指定的格式获取Java中的日期字符串.据我所知,这是:

1999年12月31日星期五,格林威治标准时间23:59:59

随着时间一直是格林尼治标准时间.

什么是最简单的方法从日期/日历/?

jon*_*ejj 58

java.time

如果您使用的是Java 8和更高版本可以为预定义的格式RFC 1123,DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss O").

__PRE__

  • 我用它除了ZonedDateTime.now(ZoneId.of("GMT")).谢谢你的回答. (6认同)
  • 这仅适用于10日或之后的日期.对于单个数字日期,RFC 5322要求日期为两位数,但这行代码会生成一个数字日期字段.http://tools.ietf.org/html/rfc5322#section-3.3 (5认同)
  • @PavanKumar:好点,但我认为引用是错误的:) RFC 5322,第3.3节说`day =([FWS] 1*2DIGIT FWS)/ obs-day`."1*2DIGIT"表示"DIGIT中至少有一个,最多两个"(RFC 5322引用的https://tools.ietf.org/html/rfc5234#section-3.6).出于HTTP/1.1的目的:RFC 2616,第3.3节,引用RFC 1123的"固定长度"格式(使用相同的定义"1*2DIGIT"),将日定义为"2DIGIT".一团糟 :) (5认同)
  • @jontejj你可以用预定义的常量`ZoneOffset.UTC`替换`ZoneId.of("GMT")`. (4认同)
  • 很高兴在Java 8中看到这个但是,这对我来说不太有用,我不得不使用ZonedDateTime.now()而不是Instant.now() (2认同)

Han*_* R. 49

如果其他人试图在这里找到答案(就像我做的那样),这里有什么可以解决的问题:

String getServerTime() {
    Calendar calendar = Calendar.getInstance();
    SimpleDateFormat dateFormat = new SimpleDateFormat(
        "EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
    dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
    return dateFormat.format(calendar.getTime());
}
Run Code Online (Sandbox Code Playgroud)

为了使服务器说英语并在GMT时区给出时间.

  • 该代码是人们讨厌Java的一个主要例子.我和@jontejj一起回答了问题. (3认同)
  • 应该注意的是,“SimpleDateFormat”的使用不是线程安全的,并且“dateFormat”必须是非共享的,或者如果共享,则必须正确同步。最好使用 Java 8 或 Joda Time 类。 (2认同)

Mar*_*ter 25

如果您正在使用Joda-Time(我强烈建议您在Java中处理日期和时间),您可以:

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

...

private static final DateTimeFormatter RFC1123_DATE_TIME_FORMATTER = 
    DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss 'GMT'")
    .withZoneUTC().withLocale(Locale.US);

...

RFC1123_DATE_TIME_FORMATTER.print(new DateTime())
Run Code Online (Sandbox Code Playgroud)

  • Joda-Time 项目目前处于维护模式。该团队建议迁移到 Java 8 及更高版本中内置的 *java.time* 类。 (3认同)

Mal*_*alt 10

每月两位数

根据RFC7231,某些应用程序要求格式包含每月两位数字。Java 8 DateTimeFormatter.RFC_1123_DATE_TIME使用一位数字:

System.out.println(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now(ZoneOffset.UTC)));
Run Code Online (Sandbox Code Playgroud)

输出: Wed, 1 Aug 2018 14:56:46 GMT

有些应用程序不喜欢这样。在使用使用Joda-time或pre-java8的旧答案之前SimpleDateFormat,这是一个有效的Java-8 DateTimeFormatter

DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss O")

现在,当您执行此操作时:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss O");
System.out.println(formatter.format(ZonedDateTime.now(ZoneOffset.UTC)));
Run Code Online (Sandbox Code Playgroud)

您得到Wed, 01 Aug 2018 14:56:46 GMT-请注意月日字段中的前导零。

  • 您还需要记住在格式化程序中设置英语区域设置 (2认同)
  • 不,我的意思是,如果您使用该模式“EEE,dd MMM yyyy HH:mm:ss O”并且没有设置英语区域设置,那么缩写的月份名称“MMM”将采用您区域设置的语言,这显然会获胜不再符合 RFC_1123 (2认同)

om-*_*nom 8

如果您不担心其他依赖项,可以使用apache DateUtils:

import org.apache.http.impl.cookie.DateUtils;
DateUtils.formatDate(new Date(System.currentTimeMillis()));
// Tue, 17 Apr 2012 18:59:02 GMT
Run Code Online (Sandbox Code Playgroud)

这将根据RFC 822 RFC1123格式化您的日期.


K E*_*son 8

如果您和我一样,正在尝试格式化Java 8 java.time.Instant,则需要将时区显式添加到格式化程序中.像这样:

Instant instant = Instant.now();
String formatted = DateTimeFormatter.RFC_1123_DATE_TIME
        .withZone(ZoneOffset.UTC)
        .format(instant);
System.out.println(formatted);
Run Code Online (Sandbox Code Playgroud)

哪个印刷品:

2016年3月15日星期二14:45:34 GMT