Some important things that we have to know about the java.time API is the following:
- Is an evolution from the previous
java.util.Date (Calendar, TimeZone & DateFormat) - Instances of time/date now are immutable. (This is importat for lambda expressions)
- Time and Date operations now are thread safe.
- The API support strong typing, which enables you to write better code.
A quick glance to the Date methods
import java.time.*; public class DateOperations { private void operations() throws Exception { LocalDate localDate = LocalDate.now(); System.out.println("LocalDate in YYYY-MM-DD format: " + localDate); System.out.println("Day of the week: " + localDate.getDayOfWeek()); System.out.println("Next week: " + localDate.plusDays(7)); System.out.println("Is a Leap Year?: " + localDate.isLeapYear()); LocalDate christmas = LocalDate.of(2021, Month.DECEMBER, 25); System.out.println("Today is before Christmas?: " + localDate.isBefore(christmas)); LocalDate christmasParsed = LocalDate.parse("2021-12-25"); System.out.println("Christmas Parsed: " + christmasParsed); LocalDateTime localDateTime = LocalDateTime.now(); System.out.println("Local Date Time: " + localDateTime); ZonedDateTime zonedDateTime = ZonedDateTime.now(); System.out.println("Zoned Date Time: " + zonedDateTime); Instant instant = Instant.now(); System.out.println("Instant: " + instant); Instant start = Instant.now(); Thread.sleep(1000); Instant end = Instant.now(); System.out.println("Duration in seconds: " + Duration.between(start, end).getSeconds()); } public static void main(String[] args) throws Exception { new DateOperations().operations(); } } output
LocalDate in YYYY-MM-DD format: 2020-07-10 Day of the week: FRIDAY Next week: 2020-07-17 Is a Leap Year?: true Today is before Christmas?: false Christmas Parsed: 2020-12-25 Local Date Time: 2020-07-10T13:25:42.392957 Zoned Date Time: 2020-07-10T13:25:42.393143-04:00[America/Detroit] Instant: 2020-07-10T17:25:42.393278Z Duration in seconds: 1 Calculating Between Days
When you want to perform calculations between days, temporal unit interface unit can be used, since represents a unit of time. Enumeration ChronoUnit actually implements our temporal unit interface. By importing java.time.temporal,ChronoUnit.* you can use enumerations such as DAYS, WEEKS, MONTHS, YEARS and you can use methods as between.
example
import java.time.LocalDate; import java.time.Month; import java.time.Period; import static java.time.temporal.ChronoUnit.DAYS; public class BetweenDays { private void compute() { LocalDate christmas = LocalDate.of(2021, Month.DECEMBER, 25); LocalDate today = LocalDate.now(); long days = DAYS.between(today, christmas); System.out.println("There are " + days + " shopping days until Christmas"); Period untilChristmas = Period.between(today, christmas); System.out.println( "There are " + untilChristmas.getMonths() + " months and " + untilChristmas.getDays() + " days until Christmas"); } public static void main(String[] args) { new BetweenDays().compute(); } output
There are 168 shopping days until Christmas A period class also have a between method and you can use it to figure out how many days or months are between dates.
example
import java.time.LocalDate; import java.time.Month; import java.time.Period; import static java.time.temporal.ChronoUnit.DAYS; public class BetweenDays { private void compute() { LocalDate christmas = LocalDate.of(2020, Month.DECEMBER, 25); LocalDate today = LocalDate.now(); long days = DAYS.between(today, christmas); System.out.println("There are " + days + " shopping days until Christmas"); Period untilChristmas = Period.between(today, christmas); System.out.println( "There are " + untilChristmas.getMonths() + " months and " + untilChristmas.getDays() + " days until Christmas"); } public static void main(String[] args) { new BetweenDays().compute(); } } output
There are 168 shopping days until Christmas There are 5 months and 15 days until Christmas How to format LocalDate
To format a LocalDate object, uses DateTimeFormatter
example
import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class DateFormatter { private void format(){ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MMM"); LocalDate today = LocalDate.now(); System.out.println("YYYY-MMM format from now is: " + today.format(formatter)); } public static void main(String[] args){ new DateFormatter().format(); } } output
YYYY-MMM format from now is: 2020-Jul To browse the code go here, to download the code:
git clone git@github.com:josdem/java-workshop.git cd date-and-time