JAVA - 代表月份和年份

时间:2016-11-05 15:00:35

标签: java sql date

我有一个实体和一个名为task的对象,它与参考月份和年份相关

 public class Task{

        private Long id;
        private Integer referenceMonth;
        private Integer referenceYear;

        .....

 }

根据要求,任务与月份和年份相关(但不需要在该月份完成,它不是截止日期,它只是参考关系)。

在GUI中,字段可以用月份Datapicker表示,也可以用带有验证的普通输入字段表示。

我通常代表这一点,在我的类中都在DB中作为两个整数字段。

我很想知道哪一个被认为是最正确和最有用的表现。

的可能性。

1-一个唯一的日期字段,假设代表参考月的第一天,即01/01/2016

2-年份的数字字段和月份的字段

3- YYYYMM格式的数字字段

4-混合表示,一个用于DB,一个用于java

我通常使用#2,我看到#3对订购和搜索非常有用。我注意到,对我来说可能不太舒服的是#1,即使它是 - 可能 - 最正式的正确。我从不使用#4,因为我更喜欢java和db以相同的方式表示。

要考虑的一些方面(但不是全部方面):

  • 形式正确

  • 易用性

  • 在DB

  • 中查询/订购的简便性
  • 在GUI中轻松过滤

对于您认为的不同方面或应该使用的方面,哪个是最正确和最佳的解决方案?

请注意: - 这个问题与DB设计的类设计有关 - 对于类设计,它受限于java< 8

1 个答案:

答案 0 :(得分:1)

ISO 8601

当序列化为字符串和数据库时,使用标准ISO 8601格式:YYYY-MM

  

2016-12

这些标准格式易于阅读,无歧义,跨文化直观,并按时间顺序按字母顺序排序。

YearMonth

java.time类包含java.time.YearMonth。适合您的目的。

YearMonth ym = YearMonth.of( 2016 , 12 );

或者,使用方便的Month枚举。

YearMonth ym = YearMonth.of( 2016 , Month.DECEMBER );

在代码中使用这些对象而不是数字或字符串,以提供类型安全性,确保有效值,并使代码更加自我记录。

public class Task{
    private Long id;
    private YearMonth referenceYearMonth;
    …
}

要生成ISO 8601格式的字符串,请调用toString

String output = ym.toString();

该类可以解析该字符串。

YearMonth ym = YearMonth.parse( "2016-12" );

资料输入

要输入数据,请不要滥用错误的小部件。如果你没有年度月份的选择器小部件,可以制作一个年轮和一个轮子的月份。或者允许输入一对文本字段。

要填充此类字段,请查询年份和月份的YearMonth。

Integer year = ym.getYear();
Integer month = ym.getMonthValue();

您可以向Month枚举询问本地化的月份名称。

String monthName = 
    ym.getMonth().getDisplayName( 
        TextStyle.FULL , 
        Locale.CANADA_FRENCH  );

对于簿记员等重型数据输入,请考虑用户输入ISO 8601格式的单个字段。