【问题标题】:Java converting string, having millisecond to date objectJava转换字符串,具有毫秒到日期对象
【发布时间】:2012-07-04 07:45:27
【问题描述】:

我有 2 个字符串

  • 2012-06-25 15:02:22.948
  • +0530

我需要一个新字符串,它将 5:30 添加到第一个字符串中的时间。

我想我可以通过将两个字符串都转换为日期对象然后添加来做到这一点。但我不知道该怎么做,就像我使用时一样

yyyy MM dd hh:mm:ss 作为第一个字符串的日期格式,我得到一个错误。

谢谢!

【问题讨论】:

  • 但我无法将我的字符串正确解析为日期对象。我认为是因为小数点 22.948
  • 它们是毫秒...您需要使用 yyyy MM dd hh:mm:ss.SSS 作为格式
  • 前面的评论是一个很好的开始。您还会收到一个错误,因为您的第一个字符串是“yyyy-MM-dd hh:mm:ss.SSS”格式,而不是您提供的格式。
  • 另外,你的第二个字符串似乎代表时区......这指定了 IST 时区......我希望这能让你获得所需的输出

标签: java string date


【解决方案1】:

字符串2012-06-25 15:02:22.948的格式不是yyyy MM dd hh:mm:ss,所以你得到“错误”也就不足为奇了(是什么错误?你越具体,人就能更好地帮助你!)。

试试yyyy-MM-dd HH:mm:ss.SSS。请参阅API documentation of SimpleDateFormat 以了解格式字符串的确切语法。

注意:大写和小写在格式字符串中很重要。 hh 表示 12 小时制,HH 表示 24 小时制。如果您使用hh,则无法解析15 的小时数。您也没有在格式字符串中包含毫秒SSS

【讨论】:

    【解决方案2】:

    你可以合并你的字符串 String1+string2 并且可以使用格式yyyy-MM-dd HH:mm:ss.SSSZ 来解析日期。可以查看更多文档 here

    【讨论】:

      【解决方案3】:

      您遇到了异常,因为您的日期格式字符串错误。你在表单上给出了一个日期字符串

      "yyyy-MM-dd hh:mm:ss.S"
      

      SimpleDateFormat javadoc

      【讨论】:

        【解决方案4】:

        试试这个:

            DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
            Date date = format.parse("2012-06-25 15:02:22.948");
            Calendar calendar = new GregorianCalendar();
            calendar.setTimeInMillis(date.getTime());
        
            int time = Integer.parseInt("0530");
            int hour = time / 100;
            int minute = time % 100;
        
            calendar.add(Calendar.HOUR_OF_DAY, hour);
            calendar.add(Calendar.MINUTE, minute);
        
            String newDateInString = format.format(calendar.getTime());
        

        【讨论】:

          【解决方案5】:

          其他答案正确但已过时。

          java.time

          与 Java 的最早版本捆绑在一起的旧日期时间类(java.util.Date/.Calendar 等)现在已成为旧版。

          那些旧的类已被java.time 包所取代。见Oracle Tutorial。大部分功能已在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。

          LocalDateTime

          LocalDateTime 类表示没有时区的日期时间。将它们用于第一件。

          您的格式接近标准ISO 8601 格式,只需将空格替换为T

          String input = "2012-06-25 15:02:22.948";
          String inputStandardized = input.replace( " " , "T" );
          LocalDateTime ldt = LocalDateTime.parse( inputStandardized );
          

          与 UTC 的偏移量

          另一部分是offset-from-UTC。我们为此使用ZoneOffset 类。

          ZoneOffset offset = ZoneOffset.of( "+0530" );
          

          没有偏移量或时区,LocalDateTime不是时间线上的实际时刻,而是关于可能时刻的粗略概念。现在我们添加您的offset-from-UTC 来标记一个实际时刻,由OffsetDateTime 类表示。

          OffsetDateTime odt = OffsetDateTime.of( ldt , offset );
          

          分区

          时区是一个偏移量加上规则,用于处理夏令时 (DST) 等异常情况。所以最好使用时区而不是仅仅使用偏移量。

          例如,如果此数据的上下文已知为time in India,则使用Asia/Kolkata 等时区来获取ZonedDateTime

          ZoneId zoneId = ZoneId.of( "Asia/Kolkata" );
          ZonedDateTime zdt = odt.atZoneSameInstant( zoneId );
          

          【讨论】:

            猜你喜欢
            • 2012-09-12
            • 1970-01-01
            • 1970-01-01
            • 2018-12-22
            • 1970-01-01
            • 2012-08-11
            • 2012-01-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多