【问题标题】:Using date, and date only, in java在java中使用日期和仅日期
【发布时间】:2016-11-13 08:41:47
【问题描述】:

我正在编写一个 java 程序,但我已经被 Java 编程的所有 Date、DateTime 等部分卡住了很长一段时间。

我想要的是只有一个 DATE 对象。我有一堂课:

部署.java

public class Deployment {

    int id;
    LocalDate deviceDeploymentDate; //I'm unsure what this should be

    public Deployment(int id, LocalDate deviceDeploymentDate) {
        this.id = id;
        this.deviceDeploymentDate = deviceDeploymentDate;
    }

    public Deployment() {
    
    }

    public LocalDate getDeviceDeploymentDate() {
        return deviceDeploymentDate;
    }

    public void setDeviceDeploymentDate(LocalDate date) {
        this.deviceDeploymentDate = date;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

我的 GUI 中有一个日期选择器。

从此日期选择器中,我可以获取字符串格式的日期(如果需要,还可以将其更改为 int year、int month 和 int date)。由此,我想在我的 Deployment 对象中存储某种 DATE,我根本不希望时间成为其中的一部分。

问题

我应该使用哪种数据类型来执行此操作?我该怎么办?

杂项

我刚刚查看了 Joda Time,但无法从可以从日期选择器获取的字符串或整数创建 LocalDate / DateTime 类型。

【问题讨论】:

  • 您可以使用您已经使用的类型,并将时间部分设置为 00:00:00。然后在格式化输出时,不要显示时间部分。
  • 这可能是一种方法,但我宁愿使用仅包含日期元素的数据类型。原因是我要将元素存储在 SQL 数据库中,据我了解,SQL 数据库也只存储类型为“yyyy-MM-dd”的“字符串”(这就是所谓的“字符串" 不过是 Date 类型。
  • @Zeliax 不,没有严肃的数据库将日期时间类型存储为字符串。虽然您可以要求作为查询结果为您生成的值的字符串表示形式,但不要将该字符串与存储在数据库中的实际值混淆。内部存储将以比字符串更有效的方式实现。但是您想在 Java 中使用适当的数据类型是对的:请参阅 Java 中的 LocalDate 类。

标签: java date datetime datepicker jodatime


【解决方案1】:

Joda-Time 很棒,但自从 Java 8 及更高版本中的 Date-Time API 以来,几乎不需要。 Joda-Time 背后的团队甚至建议 Java 8 或更高版本的用户使用标准 API:

请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。

鉴于此,您应该使用标准 API java.time 中的 LocalDate。您的 Deployment 类看起来就像现在一样,只需确保导入正确的包 (java.time.LocalDate)。

由于您可以访问字段(年、月和日),因此您可以使用 API 中的 of() 方法之一:

LocalDate.of(year, month, day);

请注意,monthday 以 1 开头,即一月是第 1 个月。在之前的日期/日历 API 中,月份计数从 0 开始,即一月是第 0 个月。换句话说,如果您混合使用这两种 API。

顺便说一句,java.time 有一个预定义的 Month 枚举,它可能会很方便,而不是使用数月的整数:

LocalDate localDate = LocalDate.of(2012, Month.January, 31);

【讨论】:

  • 大部分 java.time 功能在 ThreeTen-Backport 项目中被反向移植到 Java 6 和 7。在ThreeTenABP 项目中进一步适配Android。 Joda-Time 团队建议迁移到 java.time。
【解决方案2】:

您可以继续使用 LocalDate(根据 David 的评论)并使用 Joda Time 中的 DateTimeFormatter 将字符串转换为 LocalDate。

final DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MMM-dd");
final LocalDate dt = dtf.parseLocalDate(yourinputString);

【讨论】:

  • 您将它们指定为决赛是否有特定原因?
猜你喜欢
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多