我有一个Date对象(java.sql.Date
)。我需要在那天晚上12点。所以我可以创建一个从当前时间到当天结束的时间段。
如何使用java.sql.Date
计算时间。请给我一个例子。
答案 0 :(得分:10)
java.sql.Date sqlDate = ...;
Calendar cal = Calendar.getInstance();
cal.setTime(sqlDate);
cal.add(Calendar.DAY_OF_YEAR,1);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
java.sql.Date sqlTommorow = new java.sql.Date(cal.getTimeInMillis());
答案 1 :(得分:7)
理想情况下,使用Joda Time这是一个 更好的日期和时间API,而不是Java中的那个。
java.sql.Date sqlDate = ...;
LocalDate date = new LocalDate(sqlDate.getTime(), DateTimeZone.UTC);
LocalDate tomorrow = date.plusDays(1);
DateTime startOfDay = tomorrow.toDateTimeAtStartOfDay(DateTimeZone.UTC);
java.sql.Date sqlTomorrow = new java.sql.Date(startOfDay.getMillis());
请注意,这假设UTC无处不在......而我怀疑你想要午夜本地时间,在这种情况下你需要指定时区。另请注意,由于夏令时,所有时区的每天都不会出现午夜 - 上面的代码会为您提供当天的开始。
答案 2 :(得分:2)
使用以下代码:
java.sql.Date now = new java.sql.Date( new java.util.Date().getTime() );
java.sql.Date tomorrow= new java.sql.Date( now.getTime() + 24*60*60*1000);
答案 3 :(得分:1)
java.util
日期时间 API 及其格式化 API SimpleDateFormat
已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*。
另外,下面引用的是来自 Joda-Time 主页的通知:
<块引用>请注意,从 Java SE 8 开始,要求用户迁移到 java.time (JSR-310) - JDK 的核心部分,取代了该项目。
使用 java.time
(现代日期时间 API)的解决方案:
java.sql.Date
对象转换为 OffsetDateTime
。OffsetDateTime
以获得具有所需值的 OffsetDateTime
(或 LocalDateTime
或 LocalDate
,根据您的数据库字段的类型)。java.time
API 与 JDBC 结合使用。前两步演示:
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
public class Main {
public static void main(String[] args) {
// A sample data for demo - you already have this object
java.sql.Date javaSqlDate = new java.sql.Date(1234567890123L);
OffsetDateTime odtFromJavaSqlDate = new java.util.Date(javaSqlDate.getTime()).toInstant()
.atOffset(ZoneOffset.UTC);
OffsetDateTime odt = odtFromJavaSqlDate.plusDays(1).with(LocalTime.MIN);
System.out.println(odt);
// If required, convert it to LocalDateTime
LocalDateTime ldt = odt.toLocalDateTime();
System.out.println(ldt);
// If required, convert it to LocalDate
LocalDate date = odt.toLocalDate();
System.out.println(date);
}
}
输出:
2009-02-14T00:00Z
2009-02-14T00:00
2009-02-14
出于任何原因,如果您需要将 OffsetDateTime
的这个对象转换为 java.util.Date
的对象,您可以这样做:
java.sql.Date result = new java.sql.Date(java.sql.Date.from(odt.toInstant()).getTime());
从 Trail: Date Time 了解有关现代 Date-Time API 的更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。
答案 4 :(得分:0)
这可能不是最好的方式,但恕我直言,它相对容易理解。 它为输入日期“now”
创建一个新的午夜java.sql.Date对象 String DATE_FORMAT = "dd.MM.yyyy";
//create a date sql.Date object
java.sql.Date now = new java.sql.Date( new java.util.Date().getTime() );
//create a date formatter
SimpleDateFormat sf = new SimpleDateFormat(DATE_FORMAT);
//get the midnight date by converting the object to a String and back to a Date object
java.util.Date midnightUtil = sf.parse( sf.format( now ) );
//create a new java.sql.Date object and add one days worth of milliseconds;
java.sql.Date midnight = new java.sql.Date( midnightUtil.getTime() + 86400000 );