有沒有關於如何使用TimeCategory(或等效)java8 LocalDate和LocalDateTime的例子或參考?我找到的所有代碼片段都引用了我試圖避免的java.util.Date。Groovy的TimeCategory與LocalDate和LocalDateTime
回答
與Java 8操縱LOCALDATE是簡單的:
LocalDate.now().plusDays(2)
我不知道什麼TimeCategory將獲得嗎?
您可以到和LOCALDATE相當LocalDatTime簡單元類本事:
import groovy.time.*
import java.time.*
LocalDate.metaClass {
plus { Duration d ->
delegate.plusYears(d.years)
.plusMonths(d.months)
.plusDays(d.days)
}
}
LocalDateTime.metaClass {
plus { Duration d ->
delegate.plusYears(d.years)
.plusMonths(d.months)
.plusDays(d.days)
.plusHours(d.hours)
.plusMinutes(d.minutes)
.plusSeconds(d.seconds)
}
}
use(TimeCategory) {
LocalDateTime.now() + 4.days
}
一個簡單的例子是:
import groovy.time.TimeCategory
import java.time.LocalDate
import java.time.LocalDateTime
use(TimeCategory) {
println Date.parse('yyyy-MM-dd', LocalDate.now().toString()) + 4.hours
println Date.parse("yyyy-MM-dd'T'hh:mm:ss", LocalDateTime.now().toString()) - 4.hours
}
是否有java8時間實體沒有原生支持?您列出的示例雖然有效,但它是冗長的方式,並逐字殺死使用TimeCategory的這一點。 – Pierre
不,它沒有任何。我同意這是冗長的。如果您正在尋找時間操作,那麼LocalDateTime和LocalDate API已經有像'plusHours()'這樣的方法。那是你正在尋找的東西嗎? – dmahapatro
是的。 Java在我身上很強大:)並且完全知道所有本地日期和時間操作函數。然而,TimeCategory對我的目標受衆(QA)提供了更好的吸引力。我想我會直接簡單地java8時間 – Pierre
我也感到失望的是TimeCategory
宣佈它自己的時間,是不是Java 8友好。這促使我寫了一些我自己的代碼,我認爲這與這個問題有關。它的重點在於ZonedDateTime
而不是LocalDateTime
,因爲我對TimeZone邏輯感興趣,我正在使用它。它並不像groovy.time.TimeCategory
這樣完整,只有少數我感興趣的操作,所以隨時添加它。
事不宜遲:
import java.time.Duration
import java.time.ZoneOffset
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import java.time.temporal.ChronoUnit
class TimeCategory {
static getDays(Integer self) { Duration.ofDays self }
static getHours(Integer self) { Duration.ofHours self }
static getMillis(Integer self) { Duration.ofMillis self }
static getMinutes(Integer self) { Duration.ofMinutes self }
static getNanos(Integer self) { Duration.ofNanos self }
static getSeconds(Integer self) { Duration.ofSeconds self }
static getWeeks(Integer self) { Duration.ofDays self * 7 }
static getDay(Integer self) { Duration.ofDays self }
static getHour(Integer self) { Duration.ofHours self }
static getMilli(Integer self) { Duration.ofMillis self }
static getMinute(Integer self) { Duration.ofMinutes self }
static getNano(Integer self) { Duration.ofNanos self }
static getSecond(Integer self) { Duration.ofSeconds self }
static getWeek(Integer self) { Duration.ofDays self * 7 }
static ZonedDateTime getAgo(Duration self) { ZonedDateTime.now() - self }
static ZonedDateTime getUtc(ZonedDateTime self) { self.withZoneSameInstant(ZoneOffset.UTC) }
static ZonedDateTime getLocal(ZonedDateTime self) { self.withZoneSameInstant(ZoneOffset.systemDefault()) }
static ZonedDateTime getNow() { ZonedDateTime.now() }
static Duration minus(ZonedDateTime self, ZonedDateTime other) { Duration.between(self, other) }
static BigInteger getTotalNanos(Duration self) { self.seconds.toBigInteger() * 10 ** 9 + self.nano }
static String toString(ZonedDateTime self, String pattern) { self.format(DateTimeFormatter.ofPattern(pattern)) }
static Duration mod(Duration self, Duration other) {
def (long seconds, int nanos) = (self.totalNanos % other.totalNanos).divideAndRemainder(10g.pow(9))
Duration.ofSeconds(seconds) + nanos.nanos
}
static load() {
Integer.mixin(TimeCategory)
ZonedDateTime.mixin(TimeCategory)
Duration.mixin(TimeCategory)
}
}
用法示例:
// I prefer putting this in a start-up location and pollute the namespace rather than use
// `use() {...}`
TimeCategory.load()
// Construct readable java 8 durations
Duration d = 1.day + 2.hours + 3.minutes - 4.seconds
// Easily construct dates relative to now
ZonedDateTime yesterday = 1.day.ago
// Of course, you can still call "unsugared" functions like truncatedTo for rounding down
ZonedDateTime today = TimeCategory.now.truncatedTo(ChronoUnit.DAYS)
// Converting between local and utc doesn't change the underlying instant
assert 0.seconds == yesterday.utc - yesterday.local
// Modulo arithmetic. Cool!
assert 1.minute % 17.seconds == 9.seconds
// Slightly cleaner date formatting
println "Today in strange format ${today.toString('dd/yy/MM')}"
- 1. Groovy的擴展TimeCategory類
- 2. 使用MOXy解組LocalDate/LocalDateTime
- 3. Joda時間從LocalDateTime字符串到LocalDate
- 4. 如何比較創建爲JodaTime LocalDate和LocalDateTime的兩個日期?
- 5. 比較LocalDate和Apache日期LocalDateTime的日期部分
- 6. 玩框架 - 與選項[LocalDate] \選項[LocalDateTime]使用範型
- 7. 在數據庫中使用Java 8 LocalDate和LocalDateTime進行休眠
- 8. Groovy腳本沙箱:使用來自Java的Groovy TimeCategory語法作爲字符串
- 9. 客戶RestEasy的與LocalDateTime
- 10. 的Java 8 LocalDateTime和Hibernate 4
- 11. 在java的日期和LocalDateTime
- 12. 解析SQLDate,java.util.Date和LOCALDATE的
- 13. Spring Java JPD與Java 8 LocalDateTime
- 14. 創建從LocalDateTime新LocalDateTime和本地時間
- 15. LocalDateTime的JPA AttributeConverter
- 16. 與LOCALDATE構造約達說構造LOCALDATE的(INT,INT,INT)是不可見的
- 17. Groovy和Spring與Maven集成
- 18. Java從LocalDateTime欄減去LocalDateTime foo
- 19. LocalDate在LocalDate有私人訪問
- 20. LocalDate和XMLGregorianCalendar之間的轉換
- 21. 春天開機,傑克遜和LOCALDATE的
- 22. Week and WeekYear的LocalDate
- 23. 的Java格式LOCALDATE
- 24. TimeCategory使用變量增加分鐘數
- 25. HSQLDB,LocalDateTime,JdbcTemplate
- 26. 毫秒到LocalDateTime
- 27. 使用LocalDateTime
- 28. 質疑LocalDateTime
- 29. LocalDateTime via Scannerinput
- 30. 對Java 8 LocalDateTime
看到我上面的評論。這完全是關於可讀性和我的目標讀者誰不是很流利的Java。 – Pierre
@Pierre您可以添加對LD和LDT的支持,而無需太多麻煩...查看編輯 –
完美!仍然不習慣groovy的動態特性,這是向外部甚至是最終類添加定製支持的一個很好的例子! – Pierre