我有三个日期作为String
个对象,格式为:dd:HH:mm:ss
00:1:9:14
00:3:10:4
00:3:39:49
如何在Java中添加这些日期以获得总和(00:7:59:07
)?
示例代码:
SimpleDateFormat sdf = new SimpleDateFormat("dd:HH:mm:ss");
Date d1 = sdf.parse("00:1:9:14");
Date d2 = sdf.parse("00:3:10:4");
Date d3 = sdf.parse("00:3:39:49");
System.out.println(d1);
System.out.println(d2);
System.out.println(d3);
Date d = new Date(d1.getTime() + d2.getTime() + d3.getTime());
System.out.println(d);
输出(错误的):
Wed Dec 31 01:09:14 IST 1969
Wed Dec 31 03:10:04 IST 1969
Wed Dec 31 03:39:49 IST 1969
Sun Dec 28 20:59:07 IST 1969
答案 0 :(得分:2)
dd
格式包含该月的某一天。因此,如果您使用00
(或Java SimpleDateFormat
,那么Date
的值将会下溢,因为它还包括该月的某一天。相反,解析你的时间部分并自己做数学。
例如,您可以使用TimePart
,days
,hours
和minutes
创建类seconds
static class TimePart {
int days = 0;
int hours = 0;
int minutes = 0;
int seconds = 0;
static TimePart parse(String in) {
if (in != null) {
String[] arr = in.split(":");
TimePart tp = new TimePart();
tp.days = ((arr.length >= 1) ? Integer.parseInt(arr[0]) : 0);
tp.hours = ((arr.length >= 2) ? Integer.parseInt(arr[1]) : 0);
tp.minutes = ((arr.length >= 3) ? Integer.parseInt(arr[2]) : 0);
tp.seconds = ((arr.length >= 4) ? Integer.parseInt(arr[3]) : 0);
return tp;
}
return null;
}
public TimePart add(TimePart a) {
this.seconds += a.seconds;
int of = 0;
while (this.seconds >= 60) {
of++;
this.seconds -= 60;
}
this.minutes += a.minutes + of;
of = 0;
while (this.minutes >= 60) {
of++;
this.minutes -= 60;
}
this.hours += a.hours + of;
of = 0;
while (this.hours >= 24) {
of++;
this.hours -= 24;
}
this.days += a.days + of;
return this;
}
@Override
public String toString() {
return String.format("%02d:%02d:%02d:%02d", days, hours, minutes,
seconds);
}
}
然后你的测试用例如
public static void main(String[] args) {
try {
TimePart d1 = TimePart.parse("00:1:9:14");
TimePart d2 = TimePart.parse("00:3:10:4");
TimePart d3 = TimePart.parse("00:3:39:49");
System.out.println(d1);
System.out.println(d2);
System.out.println(d3);
TimePart d4 = d1.add(d2).add(d3);
System.out.println(d4);
} catch (Exception e) {
e.printStackTrace();
}
}
它似乎正确执行添加
00:01:09:14
00:03:10:04
00:03:39:49
00:07:59:07
答案 1 :(得分:1)
上面的和是算术加法所以你需要一个ref --here d0(默认纪元)。日期类有很多问题要小心......
SimpleDateFormat sdf = new SimpleDateFormat("dd:HH:mm:ss");
Date d0 = sdf.parse("00:00:00:00"); // ref
Date d1 = sdf.parse("00:01:09:14");
Date d2 = sdf.parse("00:03:10:04");
Date d3 = sdf.parse("00:03:39:49");
System.out.println(d0);
System.out.println(d1);
System.out.println(d2);
System.out.println(d3);
Date d = new Date(d1.getTime() + d2.getTime() + d3.getTime() - 2 * d0.getTime()); // impt
System.out.println(d);
注意: - 添加日期不是一件容易的事,请三思。
答案 2 :(得分:1)
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
String s1 = "01:02:03";
String s2 = "10:12:13";
Date d1 = format.parse(s1);
Date d2 = format.parse(s2);
int sec = d1.getSeconds() + d2.getSeconds();
int min = d1.getMinutes() + d2.getMinutes();
int hr = d1.getHours() + d2.getHours();
Time sum = new Time(hr, min, sec);
System.out.println(sum); // Output: 11:14:16
答案 3 :(得分:1)
您的字符串代表/表示时间量吗?因此,请使用Duration
类。首先,我们编写一个辅助方法,将字符串解析为Duration
:
private static Duration parseDuration(String timeString) {
// First convert the string to ISO 8601 through a regex
String isoTimeString = timeString.replaceFirst("^(\\d+):(\\d+):(\\d+):(\\d+)$", "P$1DT$2H$3M$4S");
// Then parse into Duration
return Duration.parse(isoTimeString);
}
Duration.parse()
需要ISO 8601格式,类似于PT1H9M14S
的使用时间为1小时9分14秒。或可选地P0DT1H9M14S
。 0D
持续0天的时间早于T
。因此,在解析之前,我使用正则表达式(又称 regex )将您的字符串格式修改为ISO 8601。替换字符串中的$1
,$2
等是指圆括号内匹配的内容,即正则表达式中的 groups 。
现在我们可以将时间加起来:
String[] timeStrings = { "00:1:9:14", "00:3:10:4", "00:3:39:49" };
Duration totalTime = Duration.ZERO;
for (String timeString : timeStrings) {
Duration dur = parseDuration(timeString);
totalTime = totalTime.plus(dur);
}
System.out.println(totalTime);
输出:
PT7H59M7S
7小时59分7秒。如果需要,可以将其格式化为00:7:59:07
的格式。搜索方式。
您的第一个错误似乎是在编写代码之前:将时代视为日期。它们不是,添加日期也没有任何意义。 4月7日和12月25日的总和是多少?
由于这种想法的误导,您试图解析为Date
个对象。 Date
是时间上的点,而不是时间上的数量,所以这是错误的。除了Date
类的设计不良之外,您还尝试使用的SimpleDateFormat
类非常麻烦。幸运的是,在这里我们没有用到它们,对于它们已经过时的日期和时间也没有用,由现代Java日期和时间API java.time取代,其中Duration
只是许多类之一。
String.replaceFirst()
关于正则表达式的使用Duration
Duration
类。答案 4 :(得分:0)
private static String addTimes(String time1, String time2) throws ParseException {
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.setTime(dateFormat.parse(time1));
c2.setTime(dateFormat.parse(time2));
c1.add(Calendar.HOUR, c2.get(Calendar.HOUR));
c1.add(Calendar.MINUTE, c2.get(Calendar.MINUTE));
c1.add(Calendar.SECOND, c2.get(Calendar.SECOND));
return dateFormat.format(c1.getTime());
}
addTimes("1:9:14", "3:10:4");
输出: 04:19:18