我正在尝试在Java中获取一个日期字符串,其格式符合HTTP 1.1规定的格式。就我所知,该格式为:
Fri, 31 Dec 1999 23:59:59 GMT
其中时间始终为GMT。
从Date/Calendar/?中获取这个字符串的最简单方法是什么?
我正在尝试在Java中获取一个日期字符串,其格式符合HTTP 1.1规定的格式。就我所知,该格式为:
Fri, 31 Dec 1999 23:59:59 GMT
其中时间始终为GMT。
从Date/Calendar/?中获取这个字符串的最简单方法是什么?
day=([FWS]1*2DIGIT FWS)/obs-day
。1*2DIGIT
意味着“至少一个,最多两个数字”(https://tools.ietf.org/html/rfc5234#section-3.6,由RFC 5322引用)。然而,针对HTTP/1.1的目的:RFC 2616,第3.3节引用了RFC 1123的“固定长度”格式(使用相同的定义1*2DIGIT
),将day定义为2DIGIT
。这很混乱 :) - ankonZoneId.of("GMT")
替换成预定义的常量ZoneOffset.UTC
。 - Basil Bourque如果有其他人试图在这里寻找答案(就像我一样),以下方法可以解决问题:
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());
}
为了将服务器设置为使用英语并在 GMT 时区中给出时间。
SimpleDateFormat
的使用是非线程安全的,如果 dateFormat
是共享的,则必须保证其非共享或正确同步。更好的选择是使用 Java 8 或 Joda Time 类。 - Konstantin Pelepelinimport 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())
private static final DateTimeFormatter RFC1123_DATE_TIME_FORMATTER = DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss 'GMT'").withZoneUTC().withLocale(Locale.US);
- Joel Sjöstrandjava.time.DateTimeFormatter
的方法,发现您的答案很有用! - Alin Gabriel Arhip一些应用程序要求日期格式包括两位数的日期,根据RFC7231规范。Java 8中的DateTimeFormatter.RFC_1123_DATE_TIME
使用单个数字:
System.out.println(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now(ZoneOffset.UTC)));
输出: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)));
您将获得 Wed, 01 Aug 2018 14:56:46 GMT
- 请注意日期中的日字段前导零。
withLocale(Locale.US)
给出了相同的结果。 - pjanssen如果你和我一样正在尝试格式化Java 8的java.time.Instant
,则需要在格式化程序中显式添加时区。像这样:
如果您和我一样正在尝试格式化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);
输出结果为:
Tue, 15 Mar 2016 14:45:34 GMT
OffsetDateTime.now( ZoneOffset.UTC ).format( DateTimeFormatter.RFC_1123_DATE_TIME )
- Basil Bourqueorg.apache.http.impl.cookie.DateUtils
已经被弃用了。现在 formatDate
方法已经移到了 org.apache.http.client.utils.DateUtils
中。 - rcgeorge23我知道这是一个晚回复,但是为了完整性,我想补充一下。
您没有提到需要字符串的用途。但如果您需要将其用于HTTP响应头,则可以使用HttpServletResponse.setDateHeader()。它会自动进行格式化。
Instant.toEpochMilli()
或(老式)Date.getTime()
中获取这些数字。 - Ole V.V.Calendar calendar = Calendar.getInstance();
SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");
System.out.println("Date: " + dateFormat.format(calendar.getTime()));