在Java中将Epoch秒转换为日期和时间格式

and*_*ser 21 java epoch datetime-format seconds

自1970年1月1日UTC(大纪元时间)以来,我有几秒钟.

1320105600

我需要将这些秒转换为以下格式的日期和时间.

Friday,November 4,2011 5:00,AM

我怎样才能做到这一点?

Bal*_*usC 32

如果您仅限于旧版java.util.Datejava.util.CalendarAPI,则需要考虑时间戳以毫秒而非秒为单位进行解释.因此,您首先需要将其乘以1000以获得时间戳(以毫秒为单位).

long seconds = 1320105600;
long millis = seconds * 1000;
Run Code Online (Sandbox Code Playgroud)

这样,您就可以将其提供给AO的构造java.util.Date和最终使用SimpleDateFormat的转换java.util.Date,以java.lang.String在所需的日期格式模式,如果需要预定义的时间段(否则将使用系统默认的时区,这是不是GMT元/ UTC se,因此格式化的时间可能会关闭).

Date date = new Date(millis);
SimpleDateFormat sdf = new SimpleDateFormat("EEEE,MMMM d,yyyy h:mm,a", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String formattedDate = sdf.format(date);
System.out.println(formattedDate); // Tuesday,November 1,2011 12:00,AM
Run Code Online (Sandbox Code Playgroud)

如果您已经使用Java8,那么LocalDateTime#ofEpochSecond()可以直接提供epoch秒,而无需乘以毫秒级的味道.

LocalDateTime dateTime = LocalDateTime.ofEpochSecond(seconds, 0, ZoneOffset.UTC);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE,MMMM d,yyyy h:mm,a", Locale.ENGLISH);
String formattedDate = dateTime.format(formatter);
System.out.println(formattedDate); // Tuesday,November 1,2011 12:00,AM
Run Code Online (Sandbox Code Playgroud)


luk*_*ymo 12

long yourSeconds = 1320105600L;
Date d = new Date(yourSeconds * 1000);
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此javadoc.构造函数需要毫秒.

要以适当的格式显示此日期,您应该检查DateFormat

这是一个例子:

DateFormat df = new SimpleDateFormat("dd MMM yyyy hh:mm:ss zzz");
System.out.println(df.format(date));
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 6

java.time

BalusC答案很好,因为它指向你使用java.time.但该答案使用的LocalDateTime地方Instant更合适.一个LocalDateTime没有时间线上的时刻,因为它故意没有概念抵消-从- UTC时区.

java.time

java.time框架是建立在Java 8和更高版本.这些类取代旧的麻烦日期时间类,如java.util.Date,.Calendar,和java.text.SimpleDateFormat.该乔达时球队还建议迁移java.time.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.

大部分java.time功能都在ThreeTen- Backport中反向移植到Java 6和7,并进一步适用于ThreeTenABP中的 Android .

Instant

UTC的时间轴上以分辨率高达纳秒的时刻由Instant类表示.

Instant instant = Instant.ofEpochSecond ( 1_320_105_600L );
Run Code Online (Sandbox Code Playgroud)

转储到控制台.您的输入值是2011年11月1日UTC的第一个时刻.在Z上月底,简称"祖鲁",是指UTC.

System.out.println ( "instant: " + instant );
Run Code Online (Sandbox Code Playgroud)

时间:2011-11-01T00:00:00Z

ZonedDateTime

在你的评论中,你提到希望通过America/Chicago时区的镜头看到这个日期时间.使用适当的时区名称.应用时区,ZoneId以获取ZonedDateTime对象.我们看到芝加哥在那个日期落后于UTC五小时.

ZoneId zoneId = ZoneId.of ( "America/Chicago" );
ZonedDateTime zdt = instant.atZone ( zoneId );
Run Code Online (Sandbox Code Playgroud)

zdt:2011-10-31T19:00-05:00 [美国/芝加哥]

字符串

上面看到的字符串是标准的ISO 8601格式.要生成其他格式的字符串,请使用DateTimeFormatter该类.您可以指定自己的自定义模式.但通常最好让java.time自动本地化为Locale对象中编码的人类语言和文化规范.

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL );
formatter = formatter.withLocale ( Locale.US );
String output = zdt.format ( formatter );
Run Code Online (Sandbox Code Playgroud)

2011年10月31日星期一下午7点00分CDT

要指定您自己的自定义格式,请搜索Stack Overflow以获取许多示例和更多讨论.


Mal*_*olm 0

诀窍是使用java.util.Datejava.text.DateFormat获得您想要的格式。您可以在网上的教程中查找如何操作。