Recipe Name:
Rewrite DateTime withZone to java.time equivalent
Description:
Rewrite DateTime withZone 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-withZone
version: 10
metadata:
  name: Rewrite DateTime withZone to java.time equivalent
  shortDescription: Rewrite DateTime withZone to java.time equivalent
  level: warning
  language: java
  enabled: true
  comment: |
    Joda-Time's DateTime class provided a withZone method to create a new DateTime object from an existing DateTime, using the same Instant but in a different Zone.
    In java.time, the same behaviour is available however the method names are more specifically named, and slightly different depending on whether you are starting from a ZonedDateTime or OffsetDateTime object.

    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:
    args:
      1:
        type: java.time.ZoneId
    argCount: 1
    name: withZone
    anyOf:
    - type: java.time.OffsetDateTime
    - type: java.time.ZonedDateTime
availableFixes:
- name: 'Rewrite withZone to java.time equivalent: atZoneSameInstant'
  availableIf:
    markedElement:
      is:
        methodcall:
          type: java.time.OffsetDateTime
  actions:
  - rewrite:
      to: '{{{ qualifier }}}.atZoneSameInstant({{{ arguments.0 }}})'
  - modifyAssignedVariable:
      type: java.time.ZonedDateTime
- name: 'Rewrite withZone to java.time equivalent: withOffsetSameInstant'
  availableIf:
    markedElement:
      is:
        methodcall:
          args:
            1:
              type: java.time.ZoneOffset
          type: java.time.OffsetDateTime
  actions:
  - rewrite:
      to: '{{{ qualifier }}}.withOffsetSameInstant({{{ arguments.0 }}})'
  - modifyAssignedVariable:
      type: java.time.OffsetDateTime
- name: 'Rewrite withZone to java.time equivalent: withZoneSameInstant'
  availableIf:
    markedElement:
      is:
        methodcall:
          type: java.time.ZonedDateTime
  actions:
  - rewrite:
      to: '{{{ qualifier }}}.withZoneSameInstant({{{ arguments.0 }}})'
  - modifyAssignedVariable:
      type: java.time.ZonedDateTime