2

我有 Java 时间1380822000000。我想转换成我可以阅读的东西:

import java.util.Date

object Ws1 {
  val a = new Date("1380822000000").toString()
}

导致异常

warning: there were 1 deprecation warning(s); re-run with -deprecation for detai
  ls
  java.lang.IllegalArgumentException
    at java.util.Date.parse(Date.java:615)
    at java.util.Date.<init>(Date.java:272)
    at .<init>(<console>:9)
    at .<clinit>(<console>)
    at .<init>(<console>:7)
    at .<clinit>(<console>)
    at $print(<console>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57
  )
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl
  .java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:734)
    at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:983)
    at scala.tools.nsc.interpreter.IMain.loadAndRunReq$1(IMain.scala:573)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:604)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:568)
    at scala.tools.nsc.interpreter.ILoop.reallyInterpret$1(ILoop.scala:745)
    at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:790)
    at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:702)
    at scala.tools.nsc.interpreter.ILoop.processLine$1(ILoop.scala:566)
    at scala.tools.nsc.interpreter.ILoop.innerLoop$1(ILoop.scala:573)
    at scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:576)
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply$mcZ$sp(ILoop.scal
  a:867)
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:822)
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:822)
    at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.
  scala:135)
    at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:822)
    at org.jetbrains.plugins.scala.worksheet.WorksheetRunner.main(WorksheetRunner.j
  ava:66)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57
  )
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl
  .java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

如何将其转换为正常的人类表示?

4

4 回答 4

6

您应该将该数字作为长整数传递以获得所需的结果,可以传递字符串但应该是可解析的。

val a = new Date(1380822000000L).toString();

查看参考资料以获取更多信息。

于 2013-10-03T15:25:01.387 回答
5

或者做更好的事情并使用org.jodatime

import org.joda.time.DateTime;

val timestamp = new DateTime(1380822000000L);

正如您在此处看到的,自 EPOCH 实施以来的毫秒数。

于 2013-10-03T15:30:32.267 回答
4

您收到一个警告:

警告:有 1 个弃用警告;

因为new Date(String)已被弃用。

其次,转换为new Date("1380822000000") 是无效的,因为它在其中是一个值。Stringdatemilli secondslong

你必须这样做

 vav a= new Date(1380822000000L).toString();
于 2013-10-03T15:23:41.380 回答
0

tl;博士

示例,采用 Java 语法。

在 UTC 中:

Instant.ofEpochMilli( Long.parseLong( "1380822000000" ) )
       .toString()

2013-10-03T17:40:00Z

在特定时区:

Instant.ofEpochMilli( Long.parseLong( "1380822000000" ) )
       .atZone( ZoneId.of( "America/Montreal" ) )
       .toString() 

2013-10-03T13:40:00-04:00[美国/蒙特利尔]

本地化:

Instant.ofEpochMilli( Long.parseLong( "1380822000000" ) )
       .atZone( ZoneId.of( "America/Montreal" )
       .format( DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL )
                                 .withLocale( Locale.CANADA_FRENCH ) 
              )

>

java.time

与旧版本 Java 捆绑在一起的臭名昭著的麻烦 java.util.Date/.Calendar 类现在已被 Java 8 及更高版本中内置的新 java.time 框架所取代。

Instant 代表时间线上的一个时刻。ZonedDateTime 将时区分配给 Instant。

请注意,java.time 的分辨率为纳秒,而早期的框架的粒度为毫秒。您将在下面看到ofEpochMilli为方便起见提供的方法,但 java.time 不限于毫秒。

Instant instant = Instant.ofEpochMilli( 1380822000000L ) ;  // Note the "L" on the long integer literal.

如果输入是字符串,则解析为long整数值。请参阅Long.parseLong静态方法。

Instant instant = Instant.ofEpochMilli( Long.parseLong( "1380822000000" ) ) ; 

您可以调整到特定的时区。

ZoneId zone = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( zone );

格式

ZonedDateTime 的方法将以ISO 8601标准toString的格式生成日期时间值的字符串表示形式。在 StackOverflow 中搜索“格式化程序”以了解如何生成其他字符串。

于 2015-07-10T18:19:03.960 回答