【问题标题】:How to calculate the difference between two java.sql.Time values?如何计算两个 java.sql.Time 值之间的差异?
【发布时间】:2014-09-15 12:09:48
【问题描述】:

我有如下表,

id | Lunch_Out | After_Lunch_In

01   |  01:15:00   |   02:00:01

我正在尝试使用以下代码查找时差,

while(rst.next())
            {
                PrintWriter obj1 = response.getWriter();
                obj1.println("while entered");

                Time a =rst.getTime("Lunch_Out");
                Time b =rst.getTime("After_Lunch_In");

                PrintWriter objt1 = response.getWriter();
                objt1.println("LougOut Time is :"+b);
                PrintWriter objt2 = response.getWriter();
                objt2.println("LogIn Time is :"+a);

//long c = b.getTime() - a.getTime() 

                long c = b.getTime() - a.getTime() / (24 * 60 * 60 * 1000);

                //PrintWriter objtr = response.getWriter();
                //objtr.println("different  is :"+c);

                Time diff = new Time(c);

                PrintWriter objt = response.getWriter();
                objt.println("different  is :"+diff);

            }

输出为:

while entered

LougOut Time is :02:00:02

LogIn Time is :01:15:01

different  is :02:00:02

但期望输出是:00:45:01。我在哪里做错了?

【问题讨论】:

  • 我认为您的运算符优先级搞砸了。你不想减去时间,然后缩放差异吗?
  • @OldProgrammer 对不起,我找不到你!
  • 我建议您让 MySQL 为您做数学运算,作为查询的一部分,例如 SELECT Lunch_Out, After_Lunch_In, subtime(After_Lunch_In, Lunch_Out) as Lunch_Duration FROM ...。详情请参阅MySQL reference manual
  • 对于 DateComparisons,请查看 JodaTime。它使数据/时间计算变得非常容易......
  • 您使用的是什么版本的 Java?如果您使用的是 Java 8,则不必使用 JodaTime 来轻松计算。

标签: java mysql


【解决方案1】:

您将ab 都转换为毫秒(自纪元以来),然后得到差异。由于您的后续行涉及调用Time constructor,因此您不需要像您所做的那样通过除以 24 * 60 * 60 * 1000 来将时间缩放到天。将c 值仅作为毫秒差值,然后在下一行将其转换为Time 对象diff

您更新后的代码应如下所示。

long c = b.getTime() - a.getTime();
Time diff = new Time(c);

但是,这将为您提供一个具有正确小时、分钟和秒数的 Time 对象,但其日期为 1970 年 1 月 1 日。由于您已将 MySQL 标记添加到您的问题中,我建议您考虑 @987654322 @在他的评论中的建议。

我建议您让 MySQL 为您计算作为查询的一部分,例如 SELECT Lunch_Out, After_Lunch_In, subtime(After_Lunch_In, Lunch_Out) as Lunch_Duration FROM ...。有关详细信息,请参阅MySQL reference manual

【讨论】:

  • No.when do you update code then I'm getting result " different is :06:15:01".
  • 但是@paul 的选择查询工作正常。但我想知道我无法通过编码获得结果的原因?
  • 我想不出什么会导致这样的问题。日期字段如何存储在您的表中(数据类型和日期格式)?
  • 我认为 06:15:01 是时区 (+06) 偏移量。因为时间正在转换为纪元日期。
  • OP 应该使用 Joda time 或 Java 8 time utils 或 Calendar。这样做是发明其他库的原因:)
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 2011-05-21
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多