从年,月,日和时间创建Date对象

时间:2015-10-13 10:40:48

标签: java date

是否可以从年,月,日和时间创建java.util.Date对象?

我正在使用此代码:

private Date convertToDate(LocalTime time)
{
    @SuppressWarnings("deprecation")
    Instant instant = time.atDate(LocalDate.of(date.getYear(),
           date.getMonth(), date.getDay())).atZone(ZoneId.systemDefault()).toInstant();
    return Date.from(instant);
}

我面临的问题是这段代码总是给我的时间增加6分32秒 如果我的LocalTime time是例如08:00创建的日期为Mon Sep 03 08:06:32 CET 115

4 个答案:

答案 0 :(得分:3)

您错误地使用Date#getYear

  

返回一个值,该值是从年份中减去1900的结果   包含或以此为代表的时刻开始   日期对象,在本地时区中解释。

getYear()的偏移量为1900,使用LocalDate.of(year, month, day)时必须添加。这就是为什么计算出的瞬发年份是115。

Instant instant = time.atDate(LocalDate.of(date.getYear() + 1900,
       date.getMonth(), date.getDay())).atZone(ZoneId.systemDefault()).toInstant();

答案 1 :(得分:1)

您可以尝试使用日历类

Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.MONTH, month);
calendar.set(Calendar.YEAR, year);
Date date = calendar.getTime();

答案 2 :(得分:1)

如果要设置日期和时间,请使用LocalDateTime类。

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class Example {
    public static void main(String[] args) {
        long hours = TimeUnit.MILLISECONDS.convert(18, TimeUnit.HOURS);
        long minutes = TimeUnit.MILLISECONDS.convert(30, TimeUnit.MINUTES);
        long seconds = TimeUnit.MILLISECONDS.convert(42, TimeUnit.SECONDS);
        long time = hours + minutes + seconds; // 6:30:42 PM
        Date date = toDate(2015, 10, 13, time);
        DateFormat dateFmt = new SimpleDateFormat("MMM d yyyy  hh:mm:ss a");

        System.out.println(dateFmt.format(date)); // Oct 13 2015  06:30:42 PM
    }

    public static Date toDate(int year, int month, int date, long time) {
        int hour = (int) TimeUnit.MILLISECONDS.toHours(time) % 24;
        int minute = (int) TimeUnit.MILLISECONDS.toMinutes(time) % 60;
        int second = (int) TimeUnit.MILLISECONDS.toSeconds(time) % 60;
        int milli = (int) TimeUnit.MILLISECONDS.toMillis(time);

        return toDate(year, month, date, hour, minute, second, milli);
    }

    public static Date toDate(int year, int month, int date) {
        return toDate(year, month, date, 0);
    }

    public static Date toDate(int year, int month, int date, int hour) {
        return toDate(year, month, date, hour, 0);
    }

    public static Date toDate(int year, int month, int date, int hour, int minute) {
        return toDate(year, month, date, hour, minute, 0);
    }

    public static Date toDate(int year, int month, int date, int hour, int minute, int second) {
        return toDate(year, month, date, hour, minute, second, 0);
    }

    public static Date toDate(int year, int month, int date, int hour, int minute, int second, int milli) {
        return toDate(LocalDateTime.of(year, month, date, hour, minute, second, milli));
    }

    public static Date toDate(LocalDateTime timestamp) {
        return Date.from(timestamp.atZone(ZoneId.systemDefault()).toInstant());
    }
}

答案 3 :(得分:1)

以下是使用单线程而不弃用方法的替代解决方案:

return Date.from(date.toInstant()
                     .atZone(ZoneId.systemDefault())
                     .with(time)
                     .toInstant());