【问题标题】:Java library that adds/subtracts two Date objects to the precision of milliseconds以毫秒为精度添加/减去两个 Date 对象的 Java 库
【发布时间】:2011-09-03 11:36:48
【问题描述】:

我正在通过 java 日期库查找 1. java.util.Date, 2. Date4J 3. 乔达时代

找出我是否可以对两个日期对象执行时间减法,精确到毫秒。

我收到 2011-05-29T22:50:12.692 作为字符串,并通过使用 SimpleDateFormat 解析将其转换为 Date 对象。

另一个 Date 对象也将收到一个字符串。我想从两个 Date 对象中减去。

有什么想法吗?

基本上我想得到两个 Date 对象之间的间隔,精确到毫秒。

【问题讨论】:

  • java中的标准日期对象到毫秒级别
  • 嗨 Sam Holder,感谢您的澄清

标签: java time iso


【解决方案1】:

这就是你想要的:

Date result = new Date(d2.getTime() - d1.getTime());

说明:

d2.getTime() - d1.getTime() 

返回日期之间的毫秒差

new Date(milliseconds);

创建一个新的 Date 对象,设置为自纪元以来的毫秒数。

编辑

如果您只想要积极的差异,请将其更改为这个。这样,您输入的顺序无关紧要:

Date result = new Date(Math.abs(d2.getTime() - d1.getTime()));

【讨论】:

    【解决方案2】:

    您可以利用 XMLGregorianCalendar 而不是 SimpleDateFormat(注意 SimpleDateFormat 不是线程安全的:http://www.codefutures.com/weblog/andygrove/2007/10/simpledateformat-and-thread-safety.html):

    import javax.xml.datatype.DatatypeFactory;
    import javax.xml.datatype.XMLGregorianCalendar;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            DatatypeFactory df = DatatypeFactory.newInstance();
            XMLGregorianCalendar date2 = df.newXMLGregorianCalendar("2011-05-29T22:50:12.692");
            XMLGregorianCalendar date1 = df.newXMLGregorianCalendar("2011-03-29T22:50:12.692");
    
            System.out.println(date2.toGregorianCalendar().getTimeInMillis() - date1.toGregorianCalendar().getTimeInMillis());
        }
    
    }
    

    【讨论】:

    • 不推荐。这是出于意外目的使用数据类型。
    • @Tazzy531 - XMLGregorianCalendar 旨在将该格式的字符串用于日期信息(问题的第 1 部分)。需要注意的是 SimpleDateFormat 不是线程安全的。
    【解决方案3】:

    尝试使用Date.getTime()

    long timeBetweenInMillis = d2.getTime() - d1.getTime();
    

    编辑

    这假定d2按时间顺序在d1之后。

    【讨论】:

    • 嗨先生,这让我毫秒。我正在寻找一个精度为毫秒的日期对象,它采用 ISO 格式(即 yyyy-MM-ddTHH:mm:ss.SSS)
    • @Yakult121,这不是您要求的吗?...两个 Date 对象之间的间隔,精确到毫秒?这正是我提供的代码要做的。使用 Date.getTime() 返回 Date 对象,精度为毫秒。 Date 对象的格式和解析完全取决于您。
    • 我认为他想要一个 Date 对象作为结果。我不知道为什么。它只是自纪元以来的毫秒数。但要做到这一点,只需执行 "Date result = new Date(d2.getTime() - d1.getTime());"
    【解决方案4】:

    只需获取毫秒差异:

    long millis = date1.getTime() - date2.getTime();
    

    【讨论】:

    • 这将导致两者之间的时间为负数。
    • @mre 我猜这取决于哪个日期是 date1 哪个是 date2 :-)
    • 是的...在我的回答中包含了一个“解释”。 :)
    • @mre 这可能就是为什么你比我们其他人有更多的支持:-)
    • 哈哈大概。很遗憾,因为这些都是正确的。 :)
    【解决方案5】:

    在 java.util.Date 中有一个名为 Date.getTime() 的方法,您可以使用它来获取以英里为单位的时间。

    【讨论】:

      【解决方案6】:

      Date() 对象的内部表示是经过纪元的毫秒数。只需使用 getTime() 方法获取这些值并对其进行算术运算。然后,您可以根据该值构造一个新的 Date 对象,然后就完成了。

      【讨论】:

        【解决方案7】:

        你的意思是这样吗?

        Date d1 = 
        Date d2 =
        long intervalInMillis = d1.getTime() - d2.getTime();
        

        【讨论】:

        • 这将导致两者之间的时间为负数。
        • 您好,我已经尝试了代码,但我不明白为什么之间会有负数的时间。等待。我把减法倒过来了。
        • @Yakult121,阅读我的编辑。在这种情况下,如果d2 出现在d1 之前,那么intervalInMillis 将为负数。如果不是这样,那么intervalInMillis 不会是负数。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 2013-12-30
        • 2021-06-24
        • 1970-01-01
        • 1970-01-01
        • 2013-03-14
        • 1970-01-01
        相关资源
        最近更新 更多