在Java中将毫秒字符串转换为日期

时间:2012-09-20 00:11:01

标签: java string date

我有一个字符串x =“1086073200000”。这基本上是毫秒,我需要转换为日期。

转换我正在使用

DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");

long tempo1=Long.parseLong(x);
System.out.println(tempo1);  // output is 86073200000 instead of the whole thing
long milliSeconds=1346482800000L;

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(milliSeconds);
System.out.println(formatter.format(calendar.getTime())); 

问题是当我将字符串x转换为long时,由于long的大小限制,一些数字会消失。

如何保留整个字符串。

感谢。

4 个答案:

答案 0 :(得分:31)

double tempo=Double.parseDouble(z);

为什么要将String解析为Long作为Double

尝试使用Long.parseLong

String x = "1086073200000"

DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");

long milliSeconds= Long.parseLong(x);
System.out.println(milliSeconds);

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(milliSeconds);
System.out.println(formatter.format(calendar.getTime())); 

答案 1 :(得分:7)

我尝试了这段代码,它对我有用

public static void main(String[] args) {
    String x = "1086073200000";
    long foo = Long.parseLong(x);
    System.out.println(x + "\n" + foo);

    Date date = new Date(foo);
    DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
    System.out.println(formatter.format(date)); 
}

答案 2 :(得分:3)

Date date = new Date(milliseconds);

答案 3 :(得分:3)

TL;博士

Instant.ofEpochMilli ( 1_346_482_800_000L );
  

2012-09-01T07:00:00Z

详细

accepted answer by Tim Benderother answer by enTropy都是正确的。您将输入字符串解析为double而不是long

java.time

此外,问题和答案正在使用旧的过时日期时间类。这些现在被java.time包取代。见Oracle Tutorial。许多java.time功能已经被反向移植到Java 6& ThreeTen-Backport中的7,并在ThreeTenABP中进一步适应Android。

从纪元算起

java.time类与旧类相同的epoch计数,是UTC中1970年的第一个时刻。因此,我们可以以相同的方式开始,将输入解析为long

String input = "1086073200000";
long millis = Long.parseLong ( input );

UTC

使用该long号码获取Instant个对象。此类表示UTC时间线上的一个时刻,在概念上类似于旧java.util.Date。但是新课程的分辨率最高为nanoseconds,而旧课程的分辨率仅为milliseconds。幸运的是,Instant类有一个方便的工厂方法,从毫秒开始计算,因为 - 纪元,ofEpochMilli

Instant instant = Instant.ofEpochMilli ( millis );

时区

现在指定一个时区(ZoneId)来获取ZonedDateTime对象。这在概念上类似于java.util.Calendar,因为它代表时间轴上具有特定指定时区的时刻。

始终指定所需/预期的时区。虽然是可选的,但不要像在问题中使用Calendar那样省略时区。如果省略,则以静默方式应用JVM的当前默认时区。此默认值可能因机器而异,有时甚至在运行时(!)期间。最好指定而不是假设。

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );

转储到控制台。请注意,在UTC中,07的时间是03,而魁北克省的时间是-04:00,因为该区域的偏移量为System.out.println ( "input: " + input + " | millis: " + millis + " | instant: " + instant + " | zdt: " + zdt ); ,比UTC还要落后4小时,{{3 }}

ZonedDateTime
  

输入:1086073200000 | millis:1086073200000 |时间:2004-06-01T07:00:00Z | zdt:2004-06-01T03:00-04:00 [美国/蒙特利尔]

字符串不是日期时间

  

如何保留整个字符串。

不要将描述日期时间值的文本字符串与日期时间本身混淆。日期时间对象可以生成一个String来表示其值,但该String与日期时间对象是独立且不同的。

要从java.time对象(例如DateTimeFormatter)生成String,请执行以下操作:

  • 致电Daylight Saving Time (DST)以获得标准toString格式的字符串。
    (如上面的示例代码所示)
  • 使用ISO 8601
    (a)定义您自己的自定义格式,或者(b)自动本地化用户的人类语言和文化规范。

搜索Stack Overflow以获取有关从{{1}}生成格式化字符串的许多其他问题和解答。

关于java.time

DateTimeFormatter框架内置于Java 8及更高版本中。这些类取代了麻烦的旧java.time日期时间类,例如legacyjava.util.Date和& Calendar

现在位于SimpleDateFormatJoda-Time项目建议迁移到maintenance mode类。

要了解详情,请参阅java.time。并搜索Stack Overflow以获取许多示例和解释。规范是Oracle Tutorial

从哪里获取java.time类?

How to use ThreeTenABP…项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如ThreeTen-ExtraIntervalYearWeekYearQuarter