27

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

1320105600

我需要将秒数转换为以下格式的日期和时间。

2011 年 11 月 4 日星期五上午 5:00

我怎样才能做到这一点?

4

5 回答 5

44

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

long seconds = 1320105600;
long millis = seconds * 1000;

这样,您可以将其提供给 ao 的构造函数,java.util.Date最后用于SimpleDateFormat将 a 转换java.util.Datejava.lang.String所需的日期格式模式,如有必要,使用预定义的时区(否则它将使用系统默认时区,这不是 GMT/UTC per 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

如果您已经在使用 Java8,那么有一个LocalDateTime#ofEpochSecond()可以让您直接输入纪元秒数,而无需乘以毫秒。

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
于 2011-11-24T20:52:13.767 回答
16
long yourSeconds = 1320105600L;
Date date = new Date(yourSeconds * 1000);

有关更多信息,请参阅此javadoc。构造函数需要毫秒。

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

这是一个例子:

DateFormat df = new SimpleDateFormat("dd MMM yyyy hh:mm:ss zzz");
System.out.println(df.format(date));
于 2011-11-24T20:51:00.430 回答
10

java.time

BalusC的答案很好,因为它指出您使用 java.time。但是那个答案使用LocalDateTimewhereInstant更合适。ALocalDateTime不是时间线上的时刻,因为它故意没有offset-from-UTCtime zone的概念。

java.time

java.time框架内置于 Java 8 及更高版本中这些类取代了旧的麻烦的日期时间类,例如java.util.Date, .Calendar, & java.text.SimpleDateFormatJoda-Time团队还建议迁移到 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 );

转储到控制台。您的输入值是 2011 年 11 月 1 日UTC的第一个时刻。最后Z是“祖鲁”的缩写,表示 UTC。

System.out.println ( "instant: " + instant );

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

ZonedDateTime

在您的评论中,您提到希望通过America/Chicago时区的镜头查看此日期时间。使用正确的时区名称。应用时区 ,ZoneId以获取ZonedDateTime对象。我们看到芝加哥在那一天比世界标准时间晚了五个小时。

ZoneId zoneId = ZoneId.of ( "America/Chicago" );
ZonedDateTime zdt = instant.atZone ( zoneId );

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 );

2011 年 10 月 31 日星期一晚上 7:00:00 CDT

要指定您自己的自定义格式,请在 Stack Overflow 中搜索许多示例和更多讨论。

于 2016-07-24T00:07:27.247 回答
2
int seconds = 1320105600;
Date date = new Date(seconds * 1000);
SimpleDateFormat sdf = new SimpleDateFormat("EEEE,MMMM d,yyyy h:mm,a");
System.out.println(sdf.format(date));
于 2011-11-24T20:52:14.670 回答
0

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

于 2011-11-24T20:50:28.013 回答