Java Date/Time API

Java Date/Time API


Foundations

Q1: What is the modern Java Date/Time API?

A set of immutable, thread-safe classes in `java.time` for handling dates, times, timestamps, durations, and time zones.

Q2: Why was `java.time` introduced?

Old APIs (`Date`, `Calendar`) were mutable, confusing, and error-prone; `java.time` is cleaner and safer.

Q3: What are the biggest benefits of java.time?

  • immutable objects
  • thread safety
  • clear type separation
  • better timezone handling
  • ISO-8601 friendly formatting/parsing

Q4: Which Java version introduced java.time?

Java 8.

Q5: What is ISO-8601?

A standard date-time format, e.g. `2026-08-08T14:30:00Z`.

Core Types You Must Know

Q6: What is `LocalDate`?

Date only (year-month-day), no time, no timezone.

Q7: What is `LocalTime`?

Time only (hour-minute-second-nano), no date, no timezone.

Q8: What is `LocalDateTime`?

Date + time, but still no timezone/offset.

Q9: What is `Instant`?

A machine timestamp (point on UTC timeline), ideal for storage/event times.

Q10: What is `ZonedDateTime`?

Date-time with full timezone rules (e.g., `Europe/Warsaw`).

Q11: What is `OffsetDateTime`?

Date-time with numeric UTC offset (e.g., `+02:00`) but not full zone rules.

Q12: Instant vs LocalDateTime quick difference?

  • Instant = absolute moment.
  • LocalDateTime = human wall-clock value without timezone context.

Time Zones and Offsets

Q13: What is `ZoneId`?

Named region-based timezone (e.g., `America/NewYork`) with DST rules.

Q14: What is `ZoneOffset`?

Fixed offset from UTC (e.g., `+01:00`) without DST behavior.

Q15: Why prefer ZoneId over raw offsets for user-facing time?

ZoneId handles daylight saving and historical timezone rule changes correctly.

Q16: What does `Z` mean in timestamps?

UTC (`+00:00`) zone designator.

Q17: Backend best practice for timezone storage?

Persist timestamps in UTC (`Instant`), convert to user zone when displaying.

Creating Date/Time Values

Q18: How to get current date?

LocalDate today = LocalDate.now();

Q19: How to get current UTC instant?

Instant now = Instant.now();

Q20: How to create specific date?

LocalDate d = LocalDate.of(2026, 8, 8);

Q21: How to create specific time?

LocalTime t = LocalTime.of(14, 30, 0);

Q22: How to create ZonedDateTime with zone?

ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Europe/Warsaw"));

Parsing and Formatting

Q23: How to parse LocalDate from text?

LocalDate d = LocalDate.parse("2026-08-08");

Q24: How to parse Instant from ISO text?

Instant i = Instant.parse("2026-08-08T10:15:30Z");

Q25: What is DateTimeFormatter?

Formatter/parser class for custom and standard date-time patterns.

Q26: Format LocalDate with custom pattern?

DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/yyyy");
String s = LocalDate.now().format(f);

Q27: Why be careful with `mm` vs `MM`?

  • `MM` = month
  • `mm` = minute

This is a very common bug source.

Q28: Common safe standard formatters?

  • `DateTimeFormatter.ISOLOCALDATE`
  • `DateTimeFormatter.ISOINSTANT`
  • `DateTimeFormatter.ISOOFFSETDATETIME`

Date/Time Arithmetic

Q29: How to add days to date?

LocalDate next = date.plusDays(7);

Q30: How to subtract months?

LocalDate prev = date.minusMonths(1);

Q31: How to add hours to LocalDateTime?

LocalDateTime later = dt.plusHours(3);

Q32: Are java.time objects mutable after plus/minus?

No; they are immutable and return new objects.

Q33: Why is immutability useful here?

Safer multi-thread use and fewer accidental state-change bugs.

Duration and Period

Q34: What is `Duration`?

Time-based amount (seconds/nanos), ideal for machine time differences.

Q35: What is `Period`?

Date-based amount (years/months/days), ideal for calendar math.

Q36: Example Duration between instants?

Duration d = Duration.between(startInstant, endInstant);

Q37: Example Period between dates?

Period p = Period.between(startDate, endDate);

Q38: Duration vs Period in one line?

Duration = clock time; Period = calendar date difference.

Comparing Dates and Times

Q39: How to compare two dates?

  • `isBefore`
  • `isAfter`
  • `isEqual`

Q40: How to compare instants safely across zones?

Convert both to `Instant` and compare timeline points.

Q41: Can LocalDateTime comparisons be misleading?

Yes, if values come from different real zones but zone info is missing.

Conversions

Q42: Convert LocalDateTime to ZonedDateTime?

ZonedDateTime z = localDateTime.atZone(ZoneId.of("UTC"));

Q43: Convert ZonedDateTime to Instant?

Instant i = zonedDateTime.toInstant();

Q44: Convert Instant to user zone?

ZonedDateTime userTime = instant.atZone(ZoneId.of("America/New_York"));

Q45: Convert Date (legacy) to Instant?

Instant i = legacyDate.toInstant();

Daylight Saving Time (DST) and Edge Cases

Q46: Why is DST tricky?

Some local times are skipped or repeated during transitions.

Q47: What happens in “spring forward” gap?

Certain local times do not exist in that zone on that date.

Q48: What happens in “fall back” overlap?

Some local times occur twice with different offsets.

Q49: How to handle DST correctly?

Use `ZonedDateTime` + `ZoneId`; avoid manual offset math.

Q50: Should backend do manual timezone arithmetic?

No, rely on java.time zone rules.

Useful Enums and Helpers

Q51: What is `DayOfWeek`?

Enum representing Monday-Sunday with useful methods.

Q52: What is `Month` enum useful for?

Type-safe month handling and readable code.

Q53: How to get start of day?

LocalDateTime start = date.atStartOfDay();

Q54: How to get end-of-day safely?

Prefer half-open ranges: `[startOfDay, nextStartOfDay)` to avoid nano precision issues.

Query Ranges in Backend

Q55: Recommended date range style in queries?

Half-open interval: `timestamp >= start AND timestamp < end`.

Q56: Why half-open intervals are better?

They avoid overlap and boundary precision bugs.

Q57: How to build daily UTC range from LocalDate?

Instant from = date.atStartOfDay(ZoneOffset.UTC).toInstant();
Instant to = date.plusDays(1).atStartOfDay(ZoneOffset.UTC).toInstant();

Serialization / JSON APIs

Q58: Which type is best to expose in APIs for exact event time?

`Instant` or `OffsetDateTime` in ISO-8601 format.

Q59: Why avoid raw LocalDateTime in distributed APIs?

It has no timezone/offset context, causing ambiguity.

Q60: Jackson module needed for java.time?

`JavaTimeModule`.

Validation and Business Rules

Q61: How to validate “end must be after start”?

if (!end.isAfter(start)) throw new IllegalArgumentException("end must be after start");

Q62: How to check if date is in future?

boolean future = date.isAfter(LocalDate.now());

Q63: How to calculate age roughly?

int years = Period.between(birthDate, LocalDate.now()).getYears();

Q64: Why is age logic sometimes complex?

Leap years, timezone boundaries, and legal/business definitions can vary.

Common Mistakes

Q65: Mistake: using system default timezone silently

Always choose explicit zone when business meaning depends on time.

Q66: Mistake: storing LocalDateTime in DB for global events

Store Instant/UTC instead for unambiguous timeline representation.

Q67: Mistake: custom string parsing without formatter

Use DateTimeFormatter with explicit pattern/locale.

Q68: Mistake: assuming every day has 24 hours

DST days can be 23 or 25 hours in some zones.

Q69: Mistake: mixing old and new APIs carelessly

Convert deliberately and keep one internal standard (prefer java.time).

Interview Quick Q&A

Q70: Most important date-time backend rule?

Store UTC, convert at boundaries.

Q71: Best type for audit timestamps?

`Instant`.

Q72: Best type for birthday?

`LocalDate`.

Q73: Best type for “meeting at user local time zone”?

`ZonedDateTime` (or LocalDateTime + ZoneId together).

Q74: Period or Duration for SLA milliseconds?

`Duration`.

Q75: Why java.time is thread-safe?

Core types are immutable.

Practical Scenarios

Q76: Scenario: user submits “2026-12-01” for birthday

Parse to `LocalDate`, not Instant.

Q77: Scenario: log event creation moment

Capture `Instant.now()`.

Q78: Scenario: show event time for Tokyo user

Convert stored Instant with `ZoneId.of("Asia/Tokyo")`.

Q79: Scenario: query all orders on a date in UTC DB

Use half-open UTC range from start-of-day to next start-of-day.

Q80: Scenario: recurring monthly billing date

Use `LocalDate` plus month arithmetic with business rules for month-end handling.

Mini Code Q&A

Q81: Parse and format date quickly?

LocalDate d = LocalDate.parse("2026-08-08");
String out = d.format(DateTimeFormatter.ofPattern("dd MMM yyyy"));

Q82: Convert Instant to OffsetDateTime UTC?

OffsetDateTime odt = instant.atOffset(ZoneOffset.UTC);

Q83: Check if current instant is within window?

boolean inRange = !now.isBefore(start) && now.isBefore(end);

Q84: Get first day of current month?

LocalDate first = LocalDate.now().withDayOfMonth(1);

Q85: Get last day of current month?

LocalDate last = LocalDate.now().with(java.time.temporal.TemporalAdjusters.lastDayOfMonth());

Testing Date/Time Logic

Q86: Why is `Clock` useful in tests?

It allows deterministic “current time” instead of flaky real-time dependence.

Q87: How to make time deterministic in service code?

Inject `Clock` and use `Instant.now(clock)`.

Q88: What should date-time tests include?

Boundary moments, timezone conversion, DST transitions, end-of-month/year cases.

Q89: Why avoid relying on system default zone in tests?

CI/dev machines may differ, causing inconsistent results.

Q90: Test for half-open intervals should verify what?

Start is inclusive, end is exclusive, and adjacent ranges don’t overlap.