如何将日期和时间合并为一个对象?

18

我的dao页面从两个不同的字段接收日期和时间,现在我想知道如何将这两个日期和时间合并成一个对象,以便我可以计算时间差和总时间。我有这段代码来合并,但它不起作用,请问我在这段代码中做错了什么,请帮忙。

    Date d = new SimpleDateFormat("yyyy-MM-dd").parse("2013-01-02");
    Date t = new SimpleDateFormat("hh:mm:ss").parse("04:05:06");
    LocalDate datePart = new LocalDate(d);
    LocalTime timePart = new LocalTime(t);
    LocalDateTime dateTime = datePart.toLocalDateTime(timePart);
    System.out.println(dateTime);

重复:https://dev59.com/PWEh5IYBdhLWcg3wYSvt?rq=1 - Ivan Pronin
1
你的t实际上不是时间,而是日期。1970年1月1日上午4:05。 - Boris the Spider
2
@Boris the Spider:这并不妨碍你将其视为时间并提取时间部分,例如t.toInstant().atZone(ZoneId.systemDefault()).toLocalTime()。当你遇到java.sql.Time实例时,你必须处理这种模式... - Holger
3个回答

36
你只需要使用正确的方法,而不是调用构造函数。使用parse创建本地日期和本地时间对象,然后将这两个对象传递给LocalDateTimeof方法即可:
    LocalDate datePart = LocalDate.parse("2013-01-02");
    LocalTime timePart = LocalTime.parse("04:05:06");
    LocalDateTime dt = LocalDateTime.of(datePart, timePart);

编辑

显然,您需要将两个 Date 对象组合起来,而不是 2 个字符串。我猜您可以先使用 SimpleDateFormat 将这两个日期转换为字符串形式,然后使用上面展示的方法。

String startingDate = new SimpleDateFormat("yyyy-MM-dd").format(startDate);
String startingTime = new SimpleDateFormat("hh:mm:ss").format(startTime);

2
新的DateTime API的简单演示非常完美。我建议指出为什么上面的代码能够工作 - 即t实际上是一个日期,而在Java 8之前不支持“时间”。 - Boris the Spider
它抛出错误,不兼容的类型字符串无法转换为LocalDate。 - deepak rawat
1
你确定你是在使用 parseof 这样的方法,而不是直接将字符串赋值给 datePart 吗?@deepakrawat - Sweeper
1
@deepak rawat:此答案的开头展示了如何将String转换为LocalDateLocalTime - Holger
2
需要注意的是,这需要API 26及更高版本。 - Mustafa Ibrahim
显示剩余4条评论

5
要在Java 8中合并日期和时间,您可以使用java.time.LocalDateTime。 这还允许您使用java.time.format.DateTimeFormatter进行格式化。
示例程序:
public static void main(String[] args) {
        LocalDate date = LocalDate.of(2013, 1, 2);
        LocalTime time = LocalTime.of(4, 5, 6);
        LocalDateTime localDateTime = LocalDateTime.of(date, time);
        DateTimeFormatter format = DateTimeFormatter.ofPattern("MMM d yyyy  hh:mm a");
        System.out.println(localDateTime.format(format));
    }

1
我在这里收到了一个警告。调用需要API级别26(当前最小值为15):java.time.LocalDate#of - DevOma

3

简单而有效的方式是:

LocalDateTime dateTime = LocalDateTime.of(datePart, timePart);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接