【问题标题】:how can i get day of month of a date in java to be use in gantt chart [closed]我如何在Java中获取日期的月份日期以用于甘特图[关闭]
【发布时间】:2019-05-24 21:17:01
【问题描述】:

我想在java中获取日期的月份日期

我尝试 getday() 但它返回星期几

     for (int i =0; i<count; i++) {

  series1.add(new Task(Names.get(i),  
Date.from(LocalDate.of(Dates.get(j).getYear(), Dates.get(j).getMonth(),Dates.get(j).getDay()).atStartOfDay().toInstant(ZoneOffset.UTC)),  
Date.from(LocalDate.of(Dates.get(k).getYear(),Dates.get(k).getMonth(),Dates.get(k).getDay()).atStartOfDay().toInstant(ZoneOffset.UTC))  
         ) 
         );

  j+=2;k+=2;

}

【问题讨论】:

  • 什么是Dates
  • 确定你的班级。 Date 是指java.util.Date 吗?也许java.sql.DateDates 是什么? Dates.get() 返回什么?投票结束,因为不清楚,也没有显示正确的代码。
  • Dates.get(j).getDay() 怎么不是您问题的答案? (我不知道,只是猜测,因为你还没有确定你的类。)
  • 欢迎来到 Stack Overflow!我们肯定愿意提供帮助。只是,正如您从其他 cmets 中可以理解的那样,我们认为目前您的问题是我们无法做到的。您可以帮助我们帮助您的第一件也是最重要的事情是create a Minimal, Reproducible Example。还请包括该示例的期望结果,告诉我们观察到的结果有何不同。
  • 如果您使用java.util.Date 和/或java.sql.Date,我建议您看看是否可以避免这种情况。这些课程设计不良且早已过时。 LocalDate 属于 java.time,现代 Java 日期和时间 API,如果您可以单独使用该类(或 java.time 中的其他类)会更好。

标签: java date dayofmonth


【解决方案1】:

我查看了您之前的 Stack Overflow 问题以了解一些上下文。请不要期望 Stack Overflow 用户通常会这样做。他们不会。

据我了解,Task 是来自 JFreeChart 的 org.jfree.data.gantt.Task,其构造函数需要两个 java.util.Date 参数(开始和结束)。您正在从数据库中获取 java.sql.Date 对象。

虽然您不能(合理地)更改 JFreeChart,但从 JDBC 4.2 开始,您可以利用从数据库中获取现代 LocalDate 对象而不是老式 java.sql.Date 对象的优势:

    while (rs.next()) {
        String a = rs.getString("TITRE");
        LocalDate startDate = rs.getObject("DATE DEBUT Prévi", LocalDate.class);
        LocalDate endDate = rs.getObject("DATE FIN prévi", LocalDate.class);
        series1.add(new Task(a,  
                Date.from(startDate.atStartOfDay().toInstant(ZoneOffset.UTC)),
                Date.from(endDate.atStartOfDay().toInstant(ZoneOffset.UTC))  
                ) 
        );
    }

我发现在构造 Task 对象之前不要将获取的数据放入单独的列表中并再次取出它更简单。在您的代码中,请按照您认为最好的方式进行。

PS java.sql.Datejava.util.DategetXxx 方法已被弃用,因为它们跨时区工作不可靠,因此即使您无法避免这些类,也不要调用这些方法。如果你确实从某个地方得到了java.sql.Date,首先要做的就是调用它的toLocalDate​ 方法将其转换为现代的LocalDate

编辑:你在一个带有嵌套方法调用的语句中做了很多事情。我同意 Basil Bourque 的评论,即读者(和你自己?)可能很难理解。我相信这也是人们(包括我自己)不理解您的问题的部分原因。我们建议将其拆分。一个例子是:

        Instant startInstant = startDate.atStartOfDay().toInstant(ZoneOffset.UTC);
        Date startUtilDate = Date.from(startInstant);
        // Similarly for end date

        Task newTask = new Task(a, startUtilDate, endUtilDate);
        series1.add(newTask);

它比较冗长,但现在每个步骤都很容易理解。

我通常使用startDate.atStartOfDay(ZoneOffset.UTC).toInstant() 而不是startDate.atStartOfDay().toInstant(ZoneOffset.UTC),但这是品味或习惯的问题。两种情况下的结果都是一样的。

链接

【讨论】:

  • 是否要将区域或偏移量传递给atStartOfDay
  • 当前您将ZoneOffset.UTC 传递给错误的方法toInstant。该方法不接受任何参数。
  • 至于传递区域或偏移到atStartOfDay,我想我们并没有足够的细节来了解作者的意图。
  • 我在想ZondDateTime,但现在我明白你的意思了。这里的代码是正确的,我现在看到了,但我建议将它分成更多行以使类型更明显,P.S.很好地解决了这一切。
【解决方案2】:

我假设DatesMap,所以Dates.get(key) 返回存储在地图中的特定日期。

在这种情况下,您可以简单地使用 java.util.Calendar 从您的日期中以整数形式获取月份中的日期。

Date dt = Dates.get(key);
Calendar cal = Calendar.getInstance();
cal.setTime(dt);
int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);

希望对您有所帮助!

【讨论】:

  • 这些可怕的类在几年前被 JSR 310 定义的现代 java.time 类所取代。建议在 2019 年使用它们是糟糕的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多