是否有一个Java库可以执行php date_modify的功能?

时间:2014-02-12 06:51:58

标签: java datetime

我似乎无法找到一种很好的方法来处理包含任意修饰符(如“+ 3days”)的字符串中的Date对象,如http://www.php.net/manual/en/datetime.formats.relative.php中所述。我在标准Java API中找不到任何内容,也找不到Joda-Time

3 个答案:

答案 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 ); 将时间部分与日期部分分开。

示例:

  • P4Y = 4年
  • P1DT12H =一天半
  • PT1H30M =一个半小时

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()

First Of,Last Of,Next

搜索StackOverflow以查找使用Joda-Time查找的许多问题,以查找本周的第一个月,开始和结束,依此类推。提示:使用缩写词“joda”进行搜索,因为很少有人输入正确的名称, Joda-Time

一些解决方案几乎是内置的,例如访问日期属性并调用{{1}}以获得第一个月。其他人则需要几行代码,您可以将这些代码放入便利方法中。

同样适用于“下周六”等。

提示:

  • 不要忘记/忽略时区
    例如,一天开始的定义取决于时区。
  • 不要忘记区域设置。例如,一周的第一天取决于区域设置。
  • 不要忘记 DateTime有时间
    在考虑整天但实际使用DateTime实例时,请记得调用ISOPeriodFormat方法。忽略“午夜”相关的类,因为“withTimeAtStartOfDay”意味着要替换它们。

答案 1 :(得分:1)

DateTime中的类似函数:DateTime#plusDays

DateTime dateTime = DateTime.now();
dateTime.plusDays(3); // offset for three days from **now**

还有一整套plus方法,例如plusMinutesplusSecondsplusYears ......

编辑:如果你想在语义上懒惰......那么你必须做更多的工作。我已经创建了一个简单的正则表达式+开关语句,它将在语言时间范围内执行适当的转换。

如果您坚持使用约定并使用适当的方法,而不是向另一个方法提供单词以最终调用适当的方法,那么 远没那么痛苦

以下内容仅用于说明目的。我不推荐它,因为有毫秒漂移的情况(你可以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,你的约会问题就会消失。 :)