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

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

转换我正在使用

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的大小限制,一些数字会消失。

如何保留整个String。

谢谢。

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

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

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

我使用了以下内容,它对我有用

 Date date=new Date(milliSeconds); 

日期日期=新日期(毫秒);

TL;博士

 Instant.ofEpochMilli ( 1_346_482_800_000L ); 

2012-09-01T07:00:00Z

细节

Tim Bender接受的答案和enTropy的其他答案都是正确的。 您将输入字符串解析为double而不是long

java.time

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

从时代算起

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

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

世界标准时间

使用该long数字来获取Instant对象。 此类表示UTC时间线上的一个时刻,在概念上类似于旧的java.util.Date 。 但是新类的分辨率高达纳秒,而旧的分辨率则限制为毫秒 。 幸运的是, Instant类有一个方便的工厂方法,从ofEpochMilli开始计算毫秒以来的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 ); 

转储到控制台。 请注意,在夏令时 , 夏令时(DST) ,该区域的时间为UTC时间为07 ,而魁北克时间为03 ,因为该区域的偏移量为-04:00 ,比UTC晚4个小时。

 System.out.println ( "input: " + input + " | millis: " + millis + " | instant: " + instant + " | zdt: " + zdt ); 

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

字符串不是日期时间

如何保留整个String。

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

要从java.time对象(如ZonedDateTime生成String,请执行以下任一操作:

  • 调用toString以获取标准ISO 8601格式的String。
    (如上面的示例代码所示)
  • 使用DateTimeFormatter
    (a)定义您自己的自定义格式,或
    (b)自动本地化用户的人类语言和文化规范。

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


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。

我有以下内容

Date date = new Date(); date.setTime(Long.parseLong(milliseconds));

毫秒是一个字符串。

我希望它有所帮助。