【问题标题】:how can you combine date and sql time into a single date time in java? [duplicate]如何在java中将日期和sql时间组合成一个日期时间? [复制]
【发布时间】:2020-09-06 05:08:29
【问题描述】:

使用java Calendar如何组合开始日期、日期和开始时间?

例如:

如果开始日期是 2020 年 9 月 8 日。日期是 2,开始时间是上午 8:00,那么我们如何获得一个 java 日期,即 2020 年 9 月 9 日上午 8:00。这是我失败的尝试。

def startDateTime(Date startDate, int day, java.sql.Time startTime){    

        def date
        date = Calendar.getInstance()
        date.setTime(startDate)

        //adding day. since day 1 is the first day we need to add day - 1
        date.add(Calendar.DATE, day - 1)   
        // setting the time from startTime
        date.setTimeInMillis(startTime.getTime())
    
        return date.getTime()

    }

感谢您的帮助。

【问题讨论】:

  • 对于 Java 7,我建议通过 backport ThreeTen Backport 使用现代 Java 日期和时间 API java.time。 DateTimeUtils.toInstant(startDate).atZone(ZoneId.systemDefault()).toLocalDate().plusDays(day - 1).atTime(DateTimeUtils.toLocalTime(startTime))(我相信你会把它分解成更小的语句)。
  • kofhearts,我写了a new and modern answser for you here。它包括一个关于 Java 6 和 7 的部分。它不包括如何找到合适的日子,但你可能可以从我上面的评论中得到它和/或搜索如何。

标签: java java-7 java-calendar


【解决方案1】:

您正在呼叫date.setTime(startDate)date.setTimeInMillis(startTime.getTime())。第二种方法是覆盖第一种方法中设置的时间。您应该创建 2 个单独的日历实例。

以下是实现这一目标的方法

  1. startDaystartTime 创建单独的Calendar 实例
  2. 从在#1 中创建的单独的Calendar 对象构造一个新的Calendar 对象并根据要求添加day

完整代码如下:

import java.sql.Time;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;

public class ProofOfConcept {

    public static void main(String[] args) {
        int day = 2;

        Time startTime = new Time(1, 1, 1);
        Calendar timeCalendar = Calendar.getInstance();
        timeCalendar.setTime(startTime);

        Date startDate = new Date();
        Calendar startDateCalendar = Calendar.getInstance();
        startDateCalendar.setTime(startDate);

        /* Only java 8 and above
        LocalDateTime localDateTime = LocalDateTime.of(startDateCalendar.get(Calendar.YEAR), startDateCalendar.get(Calendar.MONTH) + 1, startDateCalendar.get(Calendar.DAY_OF_MONTH),
                timeCalendar.get(Calendar.HOUR), timeCalendar.get(Calendar.MINUTE), timeCalendar.get(Calendar.SECOND));
        localDateTime = localDateTime.plusDays(day);
        System.out.println("localDateTime : " + localDateTime);
        Date dateFromLocalDateTime = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
        System.out.println("dateFromLocalDateTime : " + dateFromLocalDateTime);*/

        Calendar result = Calendar.getInstance();
        result.set(startDateCalendar.get(Calendar.YEAR), startDateCalendar.get(Calendar.MONTH), startDateCalendar.get(Calendar.DAY_OF_MONTH) + 2,
                timeCalendar.get(Calendar.HOUR), timeCalendar.get(Calendar.MINUTE), timeCalendar.get(Calendar.SECOND));

        Date date = result.getTime();
        System.out.println("date : " + date);
    }

}

输出:

日期:2020 年 9 月 8 日星期二 01:01:01 IST

注意:我建议使用 java.time.* 包而不是 java.util.*。为什么?检查this。但这仅在 java 8 中可用。(不过,您可以在 8 以下的版本中使用 joda time)。


编辑:移动Ole V.V. 的评论以回答。

对于 Java 7,我建议通过向后端口 ThreeTen Backport 使用现代 Java 日期和时间 API java.time

static LocalDateTime startDateTime(Date startDate, int day, java.sql.Time startTime) {
    LocalTime startLocalTime = DateTimeUtils.toLocalTime(startTime);
    return DateTimeUtils.toInstant(startDate)
            .atZone(ZoneId.systemDefault())
            .toLocalDate()
            .plusDays(day - 1)
            .atTime(startLocalTime);
}

【讨论】:

  • 感谢您的解决方案,但我使用的是 java 7,我认为我无法访问 java.time 包。你能推荐java 7的方法吗?
  • 更新了我的答案
  • @Smile 您可以让您的 Java 8 代码作为其他使用 Java 8 或更高版本的读者的补充(以及升级后的 kofhearts)。如果您愿意,也可以随意包含我的 Java 7 代码和我的评论中的反向移植。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 2011-11-09
  • 2017-09-30
相关资源
最近更新 更多