我有一个实体和一个名为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
答案 0 :(得分:1)
当序列化为字符串和数据库时,使用标准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格式的单个字段。