【问题标题】:Convert millisecond String to Date in Java在Java中将毫秒字符串转换为日期
【发布时间】:2012-09-12 08:12:27
【问题描述】:

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

如何保存整个字符串。

谢谢。

【问题讨论】:

  • 所以您的代码根本与问题无关? - 您没有将字符串显示为您声称导致问题的长转换...
  • @John3136:他正在将 long(毫秒)转换为日期并尝试将其打印为“long -> string”。
  • @John3136,&Borleader 我正在读取一个文件,所以输入是 String ,我需要将其转换为 long 以便将其转换为日期。
  • 那你为什么要使用Double.parseDouble()
  • 可以发一下文件读取部分吗?您的代码完全没问题,问题一定出在您正在阅读的String 中。

标签: java string date


【解决方案1】:
double tempo=Double.parseDouble(z);

你为什么将你的 String 解析为 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())); 

【讨论】:

    【解决方案2】:

    我试过这段代码,它对我有用

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

    【讨论】:

      【解决方案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 功能已在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。

      从纪元开始计数

      java.time 类从与旧类相同的epoch 开始计数,1970 年的第一个时刻UTC。所以我们可以以同样的方式开始,将输入解析为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,比 UTC 晚四个小时,在夏季 Daylight Saving Time (DST) 下。

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

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

      字符串不是日期时间

      如何保存整个字符串。

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

      要从 java.time 对象(例如 ZonedDateTime)生成字符串,可以:

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

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


      关于java.time

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

      Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

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

      从哪里获得 java.time 类?

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

      【讨论】:

        【解决方案4】:
        Date date = new Date(milliseconds);
        

        【讨论】:

        • 不推荐使用日期构造函数
        猜你喜欢
        • 2012-01-15
        • 2020-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-11
        • 1970-01-01
        相关资源
        最近更新 更多