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

jse*_*eth 12 java string date

我有一个字符串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())); 
Run Code Online (Sandbox Code Playgroud)

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

如何保留整个String.

谢谢.

Tim*_*der 32

double tempo=Double.parseDouble(z);
Run Code Online (Sandbox Code Playgroud)

你为什么解析你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())); 
Run Code Online (Sandbox Code Playgroud)


enT*_*opy 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)); 
}
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 5

太长了;博士

\n\n
Instant.ofEpochMilli ( 1_346_482_800_000L );\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

2012-09-01T07:00:00Z

\n
\n\n

细节

\n\n

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

\n\n

java.time

\n\n

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

\n\n

从纪元开始计数

\n\n

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

\n\n
String input = "1086073200000";\nlong millis = Long.parseLong ( input );\n
Run Code Online (Sandbox Code Playgroud)\n\n

世界标准时间

\n\n

使用该long数字来获取Instant对象。此类表示 UTC 时间线上的时刻,其概念与旧的java.util.Date. 但新类的分辨率高达纳秒,而旧类的分辨率仅限于毫秒。幸运的是,该类Instant有一个方便的工厂方法,可以计算自纪元以来的毫秒数ofEpochMilli

\n\n
Instant instant = Instant.ofEpochMilli ( millis );\n
Run Code Online (Sandbox Code Playgroud)\n\n

时区

\n\n

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

\n\n

始终指定所需/预期的时区。Calendar尽管是可选的,但切勿像您在问题中使用时那样省略时区。如果省略,则静默应用 JVM\xe2\x80\x99s 当前默认时区。此默认值可能会因机器而异,并且会不时变化,甚至在运行期间也是如此。运行时(!)。明确说明比假设更好。

\n\n
ZoneId zoneId = ZoneId.of ( "America/Montreal" );\nZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );\n
Run Code Online (Sandbox Code Playgroud)\n\n

转储到控制台。请注意一天中的小时如何采用07UTC 格式,但采用 Qu\xc3\xa9bec 时间,因为在夏季夏令时 (DST)下,03该区域的偏移量为,比 UTC 晚四个小时。-04:00

\n\n
System.out.println ( "input: " + input + " | millis: " + millis + " | instant: " + instant + " | zdt: " + zdt );\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

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

\n
\n\n

字符串不是日期时间

\n\n
\n

如何保留整个 String.

\n
\n\n

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

\n\n

要从 java.time 对象(例如 )生成字符串ZonedDateTime,可以执行以下任一操作:

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

在 Stack Overflow 上搜索许多其他有关从DateTimeFormatter.

\n\n
\n\n

关于 java.time

\n\n

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

\n\n

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

\n\n

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

\n\n

从哪里获取 java.time 类?

\n\n\n\n

ThreeTen -Extra项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval、、YearWeekYearQuarter

\n