Recipe Name:
Migrate newInstance Calendar to java.time with ZoneId
Description:
Migrate newInstance Calendar to java.time with ZoneId
Level:
warning
Language:
- java
Tags:
- java.time
- java.util.Calendar
- quality
Documentation
Migrate from java.util.Date and java.util.Calendar to Java Time
Prior to the Java SE 8 release, the Java date and time mechanism was provided by the java.util.Date, java.util.Calendar, and java.util.TimeZone classes, as well as their subclasses, such as java.util.GregorianCalendar.
These classes had several drawbacks, including:
- The Calendar class was not type safe.
- Because the classes were mutable, they could not be used in multithreaded applications.
- Bugs in application code were common due to the unusual numbering of months and the lack of type safety.
Perhaps you have legacy code that uses the java.util date and time classes and you would like to take advantage of the java.time functionality with minimal changes to your code.
Examples
BeforeCalendar calendar = new GregorianCalendar(2020, 05, 10, 10, 30); calendar.add(Calendar.YEAR, 1);After
LocalDateTime calendar = LocalDateTime.of(2020, 05, 10, 10, 30); calendar.plusYears(1);References
Recipe
id: scw:calendar:new-instance-zoneid version: 10 metadata: name: Migrate newInstance Calendar to java.time with ZoneId shortDescription: Migrate newInstance Calendar to java.time with ZoneId level: warning language: java enabled: true comment: "This recipe is designed to match on broken code, the constructor that is being searched for does not actually exist on the type.\n\nWhen migrating 'new Calendar(TimeZone) ' to the java.time equivalent, the TimeZone argument must first be migrated to a java.time.ZoneId.\nThis recipe then searches for the non-existent 'new Calendar(ZoneId)' constructor, and finishes the migration by converting it to the \nequivalent java.time factory method, which will accept the ZoneId argument.\n" descriptionFile: Java/Date-Calendar/descriptions/date-calendar.html tags: java.time;java.util.Calendar;quality search: methodcall: args: 1: anyOf: - type: java.time.ZoneId - type: java.util.TimeZone argCount: 1 name: getInstance type: java.util.Calendar availableFixes: - name: Migrate to java.time.ZonedDateTime actions: - rewrite: to: java.time.ZonedDateTime.now({{{ arguments.0 }}}) - modifyAssignedVariable: type: java.time.ZonedDateTime - name: Migrate to OffsetDateTime actions: - rewrite: to: java.time.OffsetDateTime.now({{{ arguments.0 }}}) - modifyAssignedVariable: type: java.time.OffsetDateTime