我有java.sql.date和java.sql.time对象,我需要找到日期之间的持续时间。
所以我使用上面的日期和时间对象
创建java.sql.timestamp对象 Timestamp timestamp1 = new Timestamp(StartDate.getYear(),
StartDate.getMonth(), StartDate.getDay(),
StartTime.getHours(), StartTime.getMinutes(), 00,
00);
这是mycode
String date = "2010-01-05";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
java.util.Date date3 = null;
try {
date3 = sdf1.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
Date StartDate = new Date(date3.getTime());
System.out.println("Date " + StartDate);
String date2 = "2010-01-06";
java.util.Date date4 = null;
try {
date4 = sdf1.parse(date2);
} catch (ParseException exception) {
exception.printStackTrace();
}
Date EndDate = new Date(date4.getTime());
System.out.println("Date " + EndDate);
String time = "01:00";
DateFormat formatter = new SimpleDateFormat("HH:mm");
java.sql.Time StartTime = null;
try {
StartTime = new java.sql.Time(formatter.parse(time).getTime());
} catch (ParseException exception2) {
exception2.printStackTrace();
}
System.out.println("TIMEEEEEEEEEE====" + StartTime);
String time2 = "02:00";
java.sql.Time EndTime = null;
try {
EndTime = new java.sql.Time(formatter.parse(time2).getTime());
} catch (ParseException exception3) {
exception3.printStackTrace();
}
System.out.println("TIMEEEEEEEEEE====" + EndTime);
Timestamp timestamp1 = new Timestamp(StartDate.getYear(),
StartDate.getMonth(), StartDate.getDay(),
StartTime.getHours(), StartTime.getMinutes(), 00,
00);
Timestamp timestamp2 = new Timestamp(EndDate.getYear(),
EndDate.getMonth(), EndDate.getDay(),
EndTime.getHours(), EndTime.getMinutes(), 00, 00);
long milliseconds = timestamp2.getTime() - timestamp1.getTime();
int seconds = (int) milliseconds / 1000;
// calculate hours minutes and seconds
int hours = seconds / 3600;
int minutes = (seconds % 3600) / 60;
seconds = (seconds % 3600) % 60;
System.out.println(hours+"h:"+minutes+"m:"+"00s");
测试用例
当我将日期作为2010-01-05和date2作为2010-01-06时,我得到的输出如下
Date 2010-01-05
Date 2010-01-06
TIMEEEEEEEEEE====01:00:00
TIMEEEEEEEEEE====02:00:00
25h:0m:00s
当我将日期作为2010-01-05和date2作为2010-01-11给出时,我得到的负值如下所示
Date 2010-01-05
Date 2010-01-11
TIMEEEEEEEEEE====01:00:00
TIMEEEEEEEEEE====02:00:00
-23h:0m:00s
如果我做错了,请帮我纠正。 提前谢谢。
答案 0 :(得分:5)
手动时间计算: -
以毫秒(ms)转换日期并计算两个日期之间的差异,并遵循以下规则:
示例示例: -
package com.dps2.practice.dyuti;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateDifferentExample {
public static void main(String[] args) {
String dateStart = "08/11/2016 09:29:58";
String dateStop = "08/12/2016 10:31:48";
//HH converts hour in 24 hours format (0-23), day calculation
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
Date d1 = null;
Date d2 = null;
try {
d1 = format.parse(dateStart);
d2 = format.parse(dateStop);
//in milliseconds
long diff = d2.getTime() - d1.getTime();
long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
long diffHours = diff / (60 * 60 * 1000) % 24;
long diffDays = diff / (24 * 60 * 60 * 1000);
System.out.print(diffDays + " days, ");
System.out.print(diffHours + " hours, ");
System.out.print(diffMinutes + " minutes, ");
System.out.print(diffSeconds + " seconds.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
答案 1 :(得分:3)
您的计算问题是:StartDate.getDay()
等。
getDay()
将返回星期几(读取JavaDoc)和不月份的日期。您需要使用getDate()
代替。
使用您的值说明问题:2010-01-05将为getDay()
返回2,因此您将获得2010-01-02作为时间戳。 2010-01-11将为getDay()
返回1(其后6天,即(2 + 6)%7 = 1)因此您的第二个时间戳将变为2010-01-01。现在第二个时间戳在第一个时间戳之前,因此你得到一个负值。
但是,正如我在评论中已经说过的那样,您应该尝试使用一些库或至少使用不推荐的内置功能进行这些计算,以免给您带来很多麻烦(我建议您观看此视频以获取挑战的想法:https://youtube.com/watch?v=-5wpm-gesOY)。
答案 2 :(得分:2)
java.sql
日期时间类仅用于与数据库交换数据。不要将它们用于业务逻辑。此外,它们是麻烦,设计糟糕,令人困惑的旧遗留日期时间类的一部分。完全避免它们。
Java 8及更高版本中内置的java.time类取代了您正在使用的旧类。现在简单得多。
LocalDate ld = LocalDate.parse ( "2010-01-06" );
LocalTime lt = LocalTime.parse ( "01:00" );
LocalDateTime earlier = LocalDateTime.of ( ld , lt );
LocalDateTime later = earlier.plusHours ( 7 );
Duration
类表示一个时间跨度,以秒和纳秒为单位。其toString
方法以标准ISO 8601格式PnYnMnDTnHnMnS
生成字符串。此格式使用P
标记开头,T
将年 - 月 - 日分隔为小时 - 分 - 秒部分。 Duration
和Period
类都可以解析并生成这样的字符串。
Duration duration = Duration.between ( earlier , later );
在Java 8中,Duration
类莫名其妙地缺少每个部分的getter方法:days,hours,minutes,seconds,fraction of of second。 Java 9使用新的getPart
方法纠正了这一遗漏。
转储到控制台。
System.out.println ( "earlier: " + earlier + " | later: " + later + " | duration: " + duration );
之前:2010-01-06T01:00 |之后:2010-01-06T08:00 |持续时间:PT7H
请注意,您的输入缺少有关UTC或时区偏移的任何信息。所以上面看到的数学是假设通用的24小时工作日。夏令时(DST)等真实异常将被忽略。
如果确实打算使用时区,请通过atZone
方法指定时区,以实例化OffsetDateTime
或ZonedDateTime
个对象。
答案 3 :(得分:1)
这是您在问题中的复杂代码。您可以使用Date Tue Jan 05 00:00:00 UTC 2010
Date Wed Jan 06 00:00:00 UTC 2010
difference is:
24 hours : 1440 minutes : 86400 seconds
类来轻松完成。
<强>输出强>
import java.util.*;
import java.text.SimpleDateFormat;
import java.util.concurrent.TimeUnit;
public class HelloWorld {
public static void main(String[] args) {
String date = "2010-01-05";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
java.util.Date date3 = null;
try {
date3 = sdf1.parse(date);
} catch (Exception e) {
e.printStackTrace();
}
Date StartDate = new Date(date3.getTime());
System.out.println("Date " + StartDate);
String date2 = "2010-01-06";
java.util.Date date4 = null;
try {
date4 = sdf1.parse(date2);
} catch (Exception exception) {
exception.printStackTrace();
}
Date EndDate = new Date(date4.getTime());
System.out.println("Date " + EndDate);
long dateStart = StartDate.getTime(), dateStop = EndDate.getTime();
long diff = dateStop - dateStart;
long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds(diff);
long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(diff);
long diffInHours = TimeUnit.MILLISECONDS.toHours(diff);
System.out.println("\n\ndifference is:\n");
System.out.println(diffInHours + " hours : " + diffInMinutes + " minutes : " + diffInSeconds + " seconds");
}
}
<强>代码强>
BOOST_REQUIRE([1.61])
BOOST_SYSTEM
BOOST_TEST