如何在 Java 中将日期/时间从长(毫秒)转换为 RFC-822 格式

问题描述 投票:0回答:3

我有时间以毫秒为单位,我需要将其转换为 RFC-822 格式。 有我可以使用的通用 Java 库吗? 这样做的最佳实践是什么?

示例时间(以毫秒为单位):1440612000000 RFC-822 中的时间:2002 年 10 月 2 日星期三 08:00:00 EST

提前致谢。

java milliseconds rfc822
3个回答
3
投票

使用SimpleDateFormat

SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz");
dateFormat.setTimeZone(TimeZone.getTimeZone("EST")); //To use the EST time zone as in your example
dateFormat.format(new Date(timeInMiliseconds));

例如,输出 1440612000000L

Wed, 26 Aug 2015 13:00:00 EST


1
投票

可以使用Java中包含的日历类:

Calendar calendar = Calendar.getInstance();
// set time in millis
calender.setTimeInMillis(millis);

int year       = calendar.get(Calendar.YEAR);
int month      = calendar.get(Calendar.MONTH); // Jan = 0, dec = 11
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); 
int dayOfWeek  = calendar.get(Calendar.DAY_OF_WEEK);
int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);
int weekOfMonth= calendar.get(Calendar.WEEK_OF_MONTH);

int hour       = calendar.get(Calendar.HOUR);        // 12 hour clock
int hourOfDay  = calendar.get(Calendar.HOUR_OF_DAY); // 24 hour clock
int minute     = calendar.get(Calendar.MINUTE);
int second     = calendar.get(Calendar.SECOND);
int millisecond= calendar.get(Calendar.MILLISECOND);

System.out.println(sdf.format(calendar.getTime()));

System.out.println("year \t\t: " + year);
System.out.println("month \t\t: " + month);
System.out.println("dayOfMonth \t: " + dayOfMonth);
System.out.println("dayOfWeek \t: " + dayOfWeek);
System.out.println("weekOfYear \t: " + weekOfYear);
System.out.println("weekOfMonth \t: " + weekOfMonth);

System.out.println("hour \t\t: " + hour);
System.out.println("hourOfDay \t: " + hourOfDay);
System.out.println("minute \t\t: " + minute);
System.out.println("second \t\t: " + second);
System.out.println("millisecond \t: " + millisecond);

然后你可以用这些值构建一个字符串。例如。 :

String s = calender.getDisplayName(Calender.DAY_OF_WEEK, Calender.SHORT, locale) + ", " + calender.get(Calender.DAY_OF_MONTH) + " " + calender.getDisplayName(Calender.MONTH, Calender.SHORT, locale) + " " + calender.get(Calender.YEAR);

将打印:

Wed, 02 Oct 2002


0
投票

tl;博士

Instant
.ofEpochMilli ( 1_440_612_000_000L )
.atZone (
    ZoneId.of ( "America/New_York" )
)
.format ( DateTimeFormatter.RFC_1123_DATE_TIME )

在 Ideone.com 运行

2015 年 8 月 26 日星期三 14:00:00 -0400

java.time

在现代 Java 中,仅使用 java.time 类来取代存在严重缺陷的遗留日期时间类。切勿使用

Date
Calendar
SimpleDateFormat

要解析自 UTC 1970 年第一个时刻 1970-01-01T00:00Z 以来的毫秒数,请使用

Instant
类。

Instant instant = Instant.ofEpochMilli ( 1_440_612_000_000L ) ;

从 UTC 零时分秒偏移量调整到特定时区。我猜测

EST
您的意思是使用美洲东海岸的时区,例如
America/New_York

ZoneId z = ZoneId.of ( "America/New_York" ) ;
ZonedDateTime zdt = instant.atZone ( z ) ;

请明确,这里的

instant
zdt
都指的是同一时刻,时间轴上的同一点。我们只是选择通过不同的挂钟/日历来查看每个内容。

RFC 822,以及后来的RFC 1123,都是过时的格式。他们的错误之一是假设英语,假设特定的本地化规则,例如缩写和大写,以及冗余信息。这些格式已被现代协议中使用的更简单的 ISO 8601 格式所取代。 java.time 类在解析/生成文本时默认使用 ISO 8601 格式。

为了方便起见,

DateTimeFormatter
类预定义了 RFC 822/1123 格式的格式化程序,
DateTimeFormatter.RFC_1123_DATE_TIME

String output = zdt.format ( DateTimeFormatter.RFC_1123_DATE_TIME ) ;
© www.soinside.com 2019 - 2024. All rights reserved.