我正在使用Joda Time库在此库中使用parseDateTime函数将字符串解析为dateTime,并注意到此库支持的日期范围是-292,269,054到292,277,023。
有谁知道如何使用此库限制日期范围。特别是年份(YYYY)到9999?
感谢。
答案 0 :(得分:4)
答案 1 :(得分:1)
正如MadProgrammer所述,限制日期范围是您作为应用开发者的工作。 Joda-Time无法知道您认为合理的限制。
为了帮助您完成验证数据的繁琐工作,您可能会发现Bean Validation规范很有用。由JSR 303(spec 1.0)和JSR 349(spec 1.1)定义。
使用Bean Validation,您可以方便地使用注释来定义规则,例如类中特定成员变量的最小值和最大值。
答案 2 :(得分:1)
Joda-Time令人惊讶地提供了你想要的东西(真的吗?)。明显的解决方案是使用LimitChronology。一个例子:
DateTime min = new DateTime(2014, 1, 1, 0, 0);
DateTime max = new DateTime(2015, 1, 1, 0, 0).minusMillis(1);
Chronology chronology =
LimitChronology.getInstance(ISOChronology.getInstance(), min, max);
DateTime now = DateTime.now(chronology);
System.out.println(now.toString(DateTimeFormat.fullDateTime()));
// output: Donnerstag, 6. November 2014 19:08 Uhr MEZ
DateTime test = new DateTime(1970, 1, 1, 0, 0).withChronology(chronology);
System.out.println(test.toString(DateTimeFormat.fullDateTime()));
// no exception! => output: �, �. � ���� ��:�� Uhr MEZ
test = now.withYear(1970);
// IllegalArgumentException:
// The resulting instant is below the supported minimum of
// 2014-01-01T00:00:00.000+01:00 (ISOChronology[Europe/Berlin])
但我建议不要使用此功能。
第一个原因是在程序中的每个LimitChronology
- 对象上应用DateTime
会带来不便。可能你会被迫改变你的应用程序架构来安装一个中央工厂来生产这种异国情调的DateTime
- 物品,以确保你真的不会忘记任何物体。
另一个原因是所讨论的年表的部分不可靠性。它无法阻止实例化DateTime
- 受支持的有限范围之外的对象,但产生奇怪的格式化输出(参见上面的示例)。
因此,我建议您使用Interval
跟踪@MadProgrammer或@CharlieS的建议进行范围检查。
答案 3 :(得分:0)
我不确定,但您可以使用此代码进行测试
DateTime startRange = new DateTime(2010, 1, 1, 12, 0, 0, 0);
DateTime endRange = new DateTime(9999, 12, 31, 21, 59, 59, 59);
Interval interval = new Interval(startRange, endRange);
DateTime testRange = new DateTime(2014, 10, 30, 11, 0, 0, 0);
System.out.println(interval.contains(testRange)); // returns true
endRange = new DateTime(2014, 12, 31, 21, 59, 59, 59);
testRange = new DateTime(9999, 10, 30, 11, 0, 0, 0);
System.out.println(interval.contains(testRange)); // returns false