【问题标题】:create Date object from year, month, day AND time从年、月、日和时间创建日期对象
【发布时间】:2015-10-13 20:12:12
【问题描述】:

是否可以根据年、月、日和时间创建java.util.Dateobject?

我正在使用此代码:

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

【问题讨论】:

  • “日期”变量的类型是什么,为什么它不是本地变量?应该是“时间”吗?
  • 什么是“日期”?你的代码的目的是什么,对我来说没有任何意义
  • 此方法是时间记录应用程序的一部分,其中日期是类属性的一部分。 datejava.util.Datetime 是时间记录中的一个时间,但我需要它作为 java.util.Date
  • @Jbartmann 请清理您的代码示例,而不是在 cmets 中解释。如果 date 是 java.util.Date 你可以通过将它作为第二个声明的参数传递给我们来解释这一点。
  • 在此处发布获取 JVM 当前默认时区的结果可能有助于解释 06:32 之谜。致电TimeZone.getDefaultZoneId.systemDefault

标签: java date


【解决方案1】:

你错误地使用了Date#getYear

返回一个值,该值是从年份中减去 1900 的结果 包含或开始于由此表示的时间瞬间 日期对象,以当地时区解释。

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

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

【讨论】:

  • 这解决了我的问题,虽然我不知道为什么。您所做的只是将 1900 添加到年份,但现在 6 分 32 秒已经消失了。谢谢!
  • 这是因为通过atZoneLocalDateTime 固定到时间线中的某个时刻考虑到可能存在一些历史时间调整操作。对于具体的解释,您可以提出一个新问题。挖掘正确的程序非常耗时,但我敢肯定有一些专家这样做;-)
【解决方案2】:

这里是一个替代解决方案,使用单线没有弃用的方法:

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

【讨论】:

    【解决方案3】:

    如果要设置日期和时间,请使用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());
        }
    }
    

    【讨论】:

      【解决方案4】:

      您可以尝试使用日历类

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

      【讨论】:

      • 真的吗?他正在使用 LocalTime(Java 8?),您建议他使用日历?时间在哪里?
      猜你喜欢
      • 2013-05-06
      • 1970-01-01
      • 2015-10-10
      • 2018-10-15
      • 1970-01-01
      • 2018-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多