我似乎无法找到一种很好的方法来处理包含任意修饰符(如“+ 3days”)的字符串中的Date对象,如http://www.php.net/manual/en/datetime.formats.relative.php中所述。我在标准Java API中找不到任何内容,也找不到Joda-Time。
答案 0 :(得分:2)
如果您想要添加或减去文本定义的时间范围,那么就有ISO 8601的官方标准。该标准定义PnYnMnDTnHnMnS
P
的文本格式,其中T
表示Period,后跟若干年,月,日,小时,分钟,秒。中间的String input = "P3D"; // 3 days. Three hours would be "PT3H", as another example.
// Get current date-time.
DateTimeZone timeZone = DateTimeZone.forID( "Pacific/Honolulu" );
DateTime now = new DateTime( timeZone );
// Shift from current date-time by a Period specified by ISO "Duration" string.
// Yes, these date-time terms (period, duration, interval) are all mixed up.
// An effort to standardize such terms is underway. But for now, get used to it and "translate".
Period period = new Period( input );
DateTime dateTime = now.plus( period );
将时间部分与日期部分分开。
示例:
Duration库默认使用ISO 8601,包括此语法。 Joda-Time在其构造函数中使用了这样一个字符串,并使用Period class自动解析它。
System.out.println( "now: " + now );
System.out.println( "period: " + period );
System.out.println( "dateTime: " + dateTime );
转储到控制台...
now: 2014-02-11T23:02:10.087-10:00
period: P3D
dateTime: 2014-02-14T23:02:10.087-10:00
跑步时......
withMinimumValue()
搜索StackOverflow以查找使用Joda-Time查找的许多问题,以查找本周的第一个月,开始和结束,依此类推。提示:使用缩写词“joda”进行搜索,因为很少有人输入正确的名称, Joda-Time 。
一些解决方案几乎是内置的,例如访问日期属性并调用{{1}}以获得第一个月。其他人则需要几行代码,您可以将这些代码放入便利方法中。
同样适用于“下周六”等。
提示:
答案 1 :(得分:1)
是DateTime
中的类似函数:DateTime#plusDays
。
DateTime dateTime = DateTime.now();
dateTime.plusDays(3); // offset for three days from **now**
还有一整套plus
方法,例如plusMinutes
,plusSeconds
,plusYears
......
如果您坚持使用约定并使用适当的方法,而不是向另一个方法提供单词以最终调用适当的方法,那么 远没那么痛苦
以下内容仅用于说明目的。我不推荐它,因为有毫秒漂移的情况(你可以now()
.999
毫秒,后来它可能是.000
。)
public static DateTime shiftDate(String shift) {
Pattern pattern = Pattern.compile("([+-]\\d+)\\s*(millisecond[s]*|second[s]*|minute[s]*|hour[s]*|day[s]*|week[s]*|month[s]*|year[s]*)");
Matcher matcher = pattern.matcher(shift);
if(matcher.matches()) {
Integer amount = Integer.valueOf(matcher.group(1));
String duration = matcher.group(2);
DateTime now = DateTime.now();
switch(duration) {
case "millisecond":
case "milliseconds":
return now.plusMillis(amount);
case "second":
case "seconds":
return now.plusSeconds(amount);
case "minute":
case "minutes":
return now.plusMinutes(amount);
case "hour":
case "hours":
return now.plusHours(amount);
case "day":
case "days":
return now.plusDays(amount);
case "week":
case "weeks":
return now.plusWeeks(amount);
case "month":
case "months":
return now.plusMonths(amount);
case "year":
case "years":
return now.plusYears(amount);
case "now":
return now;
default:
throw new IllegalArgumentException("I'm not sure how you got past the guards, but you won't get past here.");
}
} else {
throw new IllegalArgumentException("Invalid shift pattern: " + shift);
}
}
答案 2 :(得分:-1)
呀。查看Joda-Time它比Java附带的内容更优雅。
另请注意,Date对象不是以这种方式使用的。如果要操纵时态对象,则应该使用Calendar对象。不应该操纵日期对象,尽管由于某种原因它们不是不可变的。
无论如何,得到Joda-Time,你的约会问题就会消失。 :)