Skip to content

seljabali/java-time-fun

Repository files navigation

SwiftDate

Java Time Fun

Java Time Kotlin extension functions.

Build Status Maven Central Kotlin Kotlin Weekly


- val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd")
- val date = LocalDate.parse(dateText, dateTimeFormatter)
+ val date = dateText.toLocalDate("yyyyMMdd")

- val dateFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy")
- print(dateFormatter.format(date))
+ print(date.print("MM/dd/yyyy"))

- if (ChronoUnit.YEARS.between(dateOfBirth, LocalDate.now()) < 18) {
+ if (dateOfBirth.getYearDifference(LocalDates.today) < 18) {

- val zoneId = ZoneId.of("America/Los_Angeles")
+ val zoneId = ZoneIds.AMERICA_LOS_ANGELES

Features

Parsing

Convert strings into Java Time objects with ease

val result = "01:30 AM".toLocalTime()
val result = "2021-06-07".toLocalDate()
val result = "06/07/2021".toLocalDate(format = "MM/dd/yyyy")
val result = "2024-11-15T12:34:56.123456Z".toLocalDateTime() // handles fractional seconds that Java Time doesn't
val result = "2021-10-04T10:10:00+0000".toZonedDateTime()

Creation

Create new date/time instances using factory functions

val result = LocalTimeFactory.new(hour = 7, minute = 30)
val result = LocalDateFactory.new(year = 2024, month = 11, day = 15)
val result = LocalDateTimeFactory.new(year = 2024, month = 11, day = 15)
val result = ZonedDateTimeFactory.new(year = 2024, month = 11, day = 15, zoneId = ZoneIds.AMERICA_LOS_ANGELES)

Conversion from Legacy Date Types

Easily convert legacy date objects to Java Time

val result = Date().toLocalDateTime()
val result = GregorianCalendar().toZonedDateTime()

Comparisons

Compare dates and times at various granularities

// Year
val result = dateA.compareYear(dateB)
val result = dateA.isBeforeYear(dateB)

// Month
val result = dateA.compareMonth(dateB)
val result = zonedDateA.getMonthDifference(zonedDateB) // auto-conversion to same time zone for expected results
val result = dateA.isEqualMonth(dateB)

// Day
val result = dateA.compareDay(dateB)
val result = dateA.getDayDifference(dateB)
val result = dateA.isAfterEqualDay(dateB)

// Time
val result = dateA.compareTime(dateB)
val result = dateA.getMinuteDifference(dateB)
val result = dateA.isAfterEqualTime(dateB)

Formatting

Print dates and times using a custom format

val date = "2021-07-06".toZonedDateTime()
val result = date.print(format = "MM/dd/yyyy")

Attributes & Mutations

Query and transform date/time attributes

val result = date.isAtStartOfDay()
val result = date.getDaysInMonth()

val result = date.atStartOfDay()
val result = date.getLast(DayOfWeek.FRIDAY)
val result = date.getNext(DayOfWeek.MONDAY)

Preset Dates

Quickly access commonly used dates

val result = LocalDates.startOfYear()
val result = LocalDateTimes.tomorrow()
val result = ZonedDateTimes.nextMonday()

Installation

Add the following to your module’s build.gradle:

repositories {
  mavenCentral()
}

dependencies {
  implementation("org.eljabali.sami.javatimefun:javatimefun:4.0.0")
}  
For Android

In addition to the above, you need to desugar your module:

  • Ensure you're using Gradle Plugin 4.0.0+.
  • Update module build.gradle:
android {
    defaultConfig {
        // Required when setting minSdkVersion to 20 or lower
        multiDexEnabled true
    }

    compileOptions {
        // Flag to enable support for the new language APIs
        coreLibraryDesugaringEnabled true
        // Sets Java compatibility to Java 8
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
}

For more information on Android desugaring click here.

Find this library useful? 😏

If you like what you see, please star the repository as others have! ⭐️