【问题标题】:String-Date conversion with nanoseconds以纳秒为单位的字符串日期转换
【发布时间】:2012-08-17 06:16:41
【问题描述】:

我已经为 Android 应用程序的这段代码苦苦挣扎了一段时间,但我无法掌握它。我已经阅读并尝试了在 stackoverflow 和其他地方找到的所有解决方案,但仍然没有运气。

我想要做的是将"17.08.2012 05:35:19:7600000" 之类的字符串转换为UTC 日期的函数,以及一个接受UTC date 并将其转换为类似字符串的函数。

String value = "17.08.2012 05:35:19:7600000";
DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss:SSSSSSS");
try
{
  Date today = df.parse(value);
  System.out.println("Today = " + df.format(today) + " " + today.toGMTString());
} 
catch (ParseException e)
{
  e.printStackTrace();
}

这导致:Today = 17.08.2012 07:41:59:0000000 17 Aug 2012 04:41:59 GMT 这两个都是错误的。

我尝试将SDF's timezone 设置为UTC,没有运气。
我注意到的另一件事:如果我这样做 df.setLenient(false);
它给了我:java.text.ParseException: Unparseable date: "17.08.2012 05:35:19:7600000"

如果有人能给我一些解释/示例代码,我将不胜感激。提前致谢

【问题讨论】:

    标签: java android simpledateformat datetime-format date-parsing


    【解决方案1】:

    你得到的结果是绝对正确的。

    我们来分析一下:

    17.08.2012 05:35:19:7600000
    
    • 17:一个月中的某天(17 日)
    • 08:一年中的月份(八月)
    • 2012:年份(2012)
    • 05:一天中的小时(凌晨 5 点)
    • 35:分钟 (:35)
    • 19:分秒 (:19)
    • 7600000:毫秒数 (7,600,000)

    现在,VM 看到这一点的方式是,您将一天中的时间声明为上午 5:35:19,然后将其添加 7,600,000 毫秒。 7,600,000 毫秒 = 7,600 秒 = 2 小时 6 分钟 40 秒。上午 5:35:19 + 02:06:40 = 上午 7:41:59(和 0 毫秒)。这就是你得到的结果。 (您似乎也没有正确设置时区,因此 GMT 字符串比您的结果晚了 3 小时。)

    如果您想保留:7600000,据我所知这是不可能的。由于这可以简化为几秒钟,VM 会自动将其减少为其他时间增量。毫秒(SSSS)应该用于存储值

    我建议你为你的输出创建一个新的SimpleDateFormat;但请记住,毫秒将被吸收到其他时间(因为它们都作为单个 long 存储在 Date 对象中)。

    【讨论】:

    • 谢谢!在 setTimeZone(TimeZone.getTimeZone("UTC")) 之后一切正常。至于毫秒,我想我会把它们重置为 0。不要认为这对我来说很重要。我给出的示例是来自服务器的响应,作为现在的 UTC,我必须看看为什么它会返回那些毫秒。
    • 很高兴您发现了问题!祝你好运! :)
    【解决方案2】:
        private String convertDate(String cdate)
    {
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss:SSSSSSS");
        SimpleDateFormat postFormater = new SimpleDateFormat("yyyy-MM-dd");
        Date convertedDate;
        try
        {
            convertedDate = dateFormat.parse(cdate);
            cdate = postFormater.format(convertedDate);
        }
        catch (ParseException e)
        {
            Toast.makeText(getApplicationContext(),e.toString(),Toast.LENGTH_SHORT).show();
        }
        return cdate;
    }
    

    试试这个。

    【讨论】:

      【解决方案3】:

      这是你需要的(但它会丢失毫秒信息):

      "dd.MM.yyyy HH:mm:ss.'000000'"
      

      如果您使用"dd.MM.yyyy HH:mm:ss.SSSSSS",那么您的毫秒数会得到三个前导零。

      如果您使用"dd.MM.yyyy HH:mm:ss.SSS'000'",那么您可以格式化日期,但不解析任何日期。

      试试看:

      public static void main(String[] args) throws ParseException {
          printDate("dd.MM.yyyy HH:mm:ss.SSS");//02.05.2010 21:45:58.073
          printDate("dd.MM.yyyy HH:mm:ss.SSSSSS");//02.05.2010 21:45:58.000073
          printDate("dd.MM.yyyy HH:mm:ss.SSS'000'");//02.05.2010 21:45:58.073000
          printDate("dd.MM.yyyy HH:mm:ss.'000000'");//02.05.2010 21:45:58.000000
      
          tryToParseDate("dd.MM.yyyy HH:mm:ss.SSS");//good
          tryToParseDate("dd.MM.yyyy HH:mm:ss.SSSSSS");//good
          tryToParseDate("dd.MM.yyyy HH:mm:ss.SSS'000'");//bad
          tryToParseDate("dd.MM.yyyy HH:mm:ss.'000000'");//good
      }
      
      private static void printDate(String formatString) {
          Date now = new Date();
          SimpleDateFormat format = new SimpleDateFormat(formatString);
          String formattedDate = format.format(now);
      
          // print that date
          System.out.println(formattedDate);
      }
      
      private static void tryToParseDate(String formatString) {
          Date now = new Date();
          SimpleDateFormat format = new SimpleDateFormat(formatString);
          String formattedDate = format.format(now);
      
          // try to parse it again
          try {
              format.parse(formattedDate);
              System.out.println("good");
          } catch (ParseException e) {
              System.out.println("bad");
          }
      }
      

      【讨论】:

        【解决方案4】:

        要减少纳秒,请使用:

        new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.")
        

        【讨论】:

        • 是否可以忽略纳秒但将时区包含在这样的字符串中:2020-12-15T15:40:15.000000Z
        猜你喜欢
        • 2020-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-24
        • 2021-09-13
        相关资源
        最近更新 更多