我似乎找不到一個很好的方法來處理來自包含任意修飾符(如「+ 3days」)的字符串的Date對象,如http://www.php.net/manual/en/datetime.formats.relative.php中所述。我在標準的Java API中找不到任何東西,也沒有在Joda-Time中找到任何東西。是否有一個Java庫可以完成php date_modify的功能?
回答
定義在文本
如果你想增加或減少由文本定義的時間跨度時移,也爲正式標準,ISO 8601。該標準定義了Duration的PnYnMnDTnHnMnS
的文本格式,其中P
表示期間,後面跟着若干年,月,日,小時,分鐘,秒。中間的一個T
分隔時間部分和日期部分。
實例:
- P4Y = 4年
- P1DT12H = A一天半
- PT1H30M =一小時和半
的Joda-Time圖書館將ISO 8601作爲其默認設置,包括第8是語法。 Period class在它的構造函數中接受這樣一個字符串,用ISOPeriodFormat自動解析它。
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);
轉儲到控制檯...
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
第一,最後,下一步
搜索StackOverflow上找到許多問題回答了有關使用Joda-找到月初,開始和結尾的時間f周,等等。提示:由於很少有人輸入正確的名稱,所以使用縮寫詞「joda」進行搜索,Joda-Time。
某些解決方案几乎是內置的,例如訪問月份屬性並呼籲withMinimumValue()
獲得月度首月。其他人則需要幾行代碼,您可以將這些代碼放入方便的方法中。
同上「下週六」等。
提示:
- 不要忘記/忽略時區。例如,一天何時開始的定義取決於時區。
- 別忘了區域設置。例如,一週的第一天取決於區域設置。
- 不要忘了DateTime的時間爲。
思考整天但實際使用DateTime實例時,請記得撥打withTimeAtStartOfDay
方法。忽略「午夜」相關的課程,因爲「withTimeAtStartOfDay」旨在取代它們。
There isDateTime
:DateTime#plusDays
中的類似功能。
DateTime dateTime = DateTime.now();
dateTime.plusDays(3); // offset for three days from **now**
還有一個全家plus
方法,如,plusSeconds
,plusYears
...
編輯:如果你想偷懶語義......那麼你必須做更多的工作。我創建了一個簡單的regex + switch語句,它將在給定語言時間範圍內執行適當的轉換。
這將是遠不如痛苦如果你要堅持公約,並採用適當的方法,而不是供應的話另一種方法,最終調用相應的方法。
以下內容僅供參考。我不推薦它,因爲存在毫秒漂移的情況(其中您可能有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);
}
}
是的。退房Joda-Time它比Java提供的更優雅。
另外請注意,Date對象的設計目的不在於這種方式。如果你想操作時態對象,你應該使用Calendar對象。日期對象不應該被操縱,雖然由於某些原因它們不是不可變的。
無論如何,得到喬達時間和你的約會問題將消失。 :)
- 1. 是否有PHP的打印功能可以生成有效的PHP表達式?
- 2. 是否可以在WebStorm中自動完成功能參數
- 3. 是否有可能中斷完成()
- 4. 是否可以描述一個不可能實現的功能?
- 5. 是否有可能多個S-功能組合成一個單一的MEX/DLL
- 6. vim是否具有像Eclipse一樣的自動完成功能?
- 7. 是否有可能擁有一個完全可移植的PHP開發環境?
- 8. 是否有一個JavaScript庫,以生成頂部消息功能區在stackoverflow?
- 9. 是否有可能這兩個功能
- 10. 是否有可能integerate java和php
- 11. 功能在Java中沒有完成
- 12. 自動完成功能Java
- 13. MS Edge是否有一個功能完備的Selenium WebDriver?
- 14. 是否可以將功能減少到一個單一的行?
- 15. Jquery自動完成功能不是一個功能
- 16. Javascript,jquery error TypeError:$(...)。自動完成功能不是一個功能
- 17. 是否可以顯示正在使用php完成的操作?
- 18. 有一個功能的頁面上有多個自動完成功能?
- 19. 有一個功能的jquery在啓動另一個功能之前完成
- 20. 是否有一種方法可以隱式完成此操作?
- 21. 是否有可能知道哪個線程先完成?
- 22. 是否可以完成調用活動
- 23. 完成另一個功能後執行一個功能
- 24. 上一個功能運行完成後執行一個功能
- 25. 是否有可能生成一個只有你需要的組件的庫
- 26. 是否可以改變一個單元格的Enter鍵功能?
- 27. 是否可以在android中完成TabActivity?
- 28. 是否可以輪詢任務完成?
- 29. 是否有可能在PHP中像Java的socksProxyHost一樣?
- 30. 是否有可能在Java中擴展迭代器的功能?
你能發佈一個你在php中做的事情的具體例子嗎?增加日子是微不足道的,並且可以在喬達 – Durandal
似乎OP想要某人能夠輸入「下個星期六」或「下個月的最後一天」,而不是明確的轉變。閱讀由OP鏈接的[相關格式文檔](http://www.php.net/manual/en/datetime.formats.relative.php)。 – beerbajay
剛剛發現這個,它似乎是儘可能接近它:http://stackoverflow.com/a/1268380/864358 – Phillip