Recipe Name:
Rewrite toDateMidnight() to java.time equivalent
Description:
Rewrite toDateMidnight() to java.time equivalent
Level:
warning
Language:
  • java
Tags:
  • framework specific
  • java.time
  • Joda-Time
  • quality
Documentation

Migrate from org.joda.time.DateTime to Java Time

Joda-Time DateTime migrates to java.time ZonedDateTime or OffsetDateTime.

ZonedDateTime is the same concept, date and time with time-zone.

OffsetDateTime is a new concept, date and time with offset from UTC.

Before
    DateTime dateTime = new DateTime();
    int monthOfYear = dateTime.getMonthOfYear();
After
    ZonedDateTime dateTime = ZonedDateTime.now();
    int monthOfYear = dateTime.getMonthValue();
References
Recipe
id: scw:java.time:Joda-Time:DateTime-toDateMidnight
version: 10
metadata:
  name: Rewrite toDateMidnight() to java.time equivalent
  shortDescription: Rewrite toDateMidnight() to java.time equivalent
  level: warning
  language: java
  enabled: true
  comment: |-
    Joda-Time's DateTime class provided a toDateMidnight() method to create a
    DateMidnight object from an existing DateTime. The concept of DateMidnight was
    deprecated within Joda-Time, along with the toDateMidnight() method too.
    This recipe is supplied to provide a migration in the case where the code-base
    is still using this deprecated method. There is no DateMidnight class in
    java.time, however the concept of DateMidnight was consider to be the same as
    the 'start of Day'. We can provide an equivalent to construct a ZonedDateTime
    or OffsetDateTime at the start of the day.

    This recipe is designed to match on broken code as part of an overall Joda-Time
    to java.time migration. The method that is being searched for does not actually
    exist on ZoneDateTime/OffsetDateTime. After migrating a DateTime instance to a
    ZoneDateTime or OffsetDateTime, subsequent calls may be made to methods that
    existed for DateTime, but no longer exist for ZonedDateTime/OffsetDateTime.
    This recipe matches on the methodname that no longer exists, and suggests an
    equivalent rewrite that will work for java.time.
  descriptionFile: descriptions/datetime.html
  tags: framework specific;java.time;Joda-Time;quality
search:
  methodcall:
    argCount: 0
    name: toDateMidnight
    anyOf:
    - type: java.time.ZonedDateTime
    - type: java.time.OffsetDateTime
availableFixes:
- name: Rewrite using toLocalDate().atStartOfDay(ZoneId)
  availableIf:
    markedElement:
      is:
        methodcall:
          type: java.time.ZonedDateTime
  actions:
  - rewrite:
      to: '{{{ qualifier }}}.toLocalDate().atStartOfDay({{{ qualifier }}}.getZone())'
  - modifyAssignedVariable:
      type: java.time.ZonedDateTime
- name: Rewrite using toLocalDate().atStartOfDay().atOffset(ZoneOffset)
  availableIf:
    markedElement:
      is:
        methodcall:
          type: java.time.OffsetDateTime
  actions:
  - rewrite:
      to: '{{{ qualifier }}}.toLocalDate().atStartOfDay().atOffset({{{ qualifier }}}.getOffset())'
  - modifyAssignedVariable:
      type: java.time.OffsetDateTime