当前位置: 首页 > 知识库问答 >
问题:

SimpleDataFormat未正确分析毫秒

柳英资
2023-03-14

背景:

在我的数据库表中,我有两个时间戳

timeStamp1 = 2011-08-23 14:57:26.662
timeStamp2 = 2011-08-23 14:57:26.9

当我执行“按时间戳ASC排序”时,时间戳2被认为是更大的时间戳(这是正确的)。

要求:我需要得到这些时间戳的差异(timeStamp2-timeStamp1)

我的实施:

public static String timeDifference(String now, String prev) {
    try {
        final Date currentParsed = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse(now);
        final Date previousParsed = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse(prev);
        long difference = currentParsed.getTime() - previousParsed.getTime();
        return "" + difference;
    } catch (ParseException e) {
        return "Unknown";
    }
}

答案应该是238ms,但返回的值是-653ms。我不确定我做错了什么。有什么建议吗?

共有3个答案

闻人鸿文
2023-03-14

我建议利用乔达的时间。它妥善处理这些情况。在下面的示例中,毫秒被正确地解析为200ms。

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class ParseMillis {

  public static void main(String[] args) {
    String s = "00:00:01.2";
    DateTimeFormatter format = DateTimeFormat.forPattern("HH:mm:ss.S");
    DateTime dateTime = format.parseDateTime(s);
    System.out.println(dateTime.getMillisOfSecond());
  }
}
陈项禹
2023-03-14

我不完全确定,但是JavaDoc指出:

对于解析,除非需要分隔两个相邻字段,否则忽略模式字母的数量。

这表示从2011-08-23 14:57:26.9开始的毫秒将被解析为9,而不是900。添加后面的零可能有效:2011-08-23 14:57:26.900

姚晋
2023-03-14

您正在分析的格式与使用的格式不匹配。您需要一个三位数的字段,并且只提供一位数。它需要9,并假设您的意思是009,而您想要的是900。日期格式很复杂,当您以不同的格式证明日期时,它可能会对您进行不同的解析。

文档中说,S表示毫秒数,该字段中的数字是9,因此它的行为正常。

编辑:这个例子可能会有所帮助

final SimpleDateFormat ss_SSS = new SimpleDateFormat("ss.SSS");
ss_SSS.setTimeZone(TimeZone.getTimeZone("GMT"));
for (String text : "0.9, 0.456, 0.123456".split(", ")) {
  System.out.println(text + " parsed as \"ss.SSS\" is "
      + ss_SSS.parse(text).getTime() + " millis");
}

印刷品

0.9 parsed as "ss.SSS" is 9 millis
0.456 parsed as "ss.SSS" is 456 millis
0.123456 parsed as "ss.SSS" is 123456 millis
 类似资料:
  • 我需要使用日期模式“yyyy-MM-dd”从输入字符串中解析一个日期,如果日期将以任何其他格式出现,则抛出一个错误。 这是我解析日期的一段代码: 当我在myDate中输入“2011-06-12”这样的字符串时,我将得到输出“2011年9月29日星期四00:00:00 EEST”,这很好。 当我发送了一个不正确的字符串,比如“2011-0612”,我得到了预期的错误。 当我试图传递一个仍然有两个“连

  • 每当我键入print时,代码都是而不是从文件中看到的。 对这种行为有什么解决办法吗?

  • 可能很简单,但是我找不到正确的格式来解析数据帧中的日期。 解析日期:2021年4月1日Thu(df名称:df data,列名:Date) 我的尝试: “”date_p=pd.to_datetime(nba_data.date,format=“%a%b%-m%y”)“” 我知道“-”根据错误是格式中的一个错误指令。然而,据我所知,只有%m会指01而不是1。我的假设对吗。 会非常感谢任何帮助。

  • 运行时错误: 线程"main"java.time.format.DateTimeParseException中的异常:无法在索引20解析文本'1999-09-09 09:09:09.999' 如何解决我的案子?

  • 我试图了解更多关于java线程转储的信息。我正在使用JBOSS EAP 4.3。 目前,我在我的一个环境中面临性能问题。突然,CPU利用率上升到700%。我把线程转储了,它是一个巨大的文件。 我在我的threaddump中发现了很多下面等待的线程条目。 我想从上面的等待线程中理解。是什么导致CPU利用率上升?

  • 我正在运行一个2节点的elasticsearch集群,并将我的所有索引配置为2个主碎片和1个副本。起初,我认为每个节点将存储1个主碎片和1个副本,尽管这不是正在发生的事情。 如上所示,每个碎片都由单个节点托管,没有分配副本。 我做错了什么?