-9

The following code gives the wrong information:

import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;

public class test {

    public static void main(String[] args) {

        GregorianCalendar fmt = new GregorianCalendar(2000, 7, 3);
        SimpleDateFormat df = new SimpleDateFormat("dd-MMM-yyyy");
        String result = df.format(fmt.getTime());

        System.out.println("fmt: " + result);

    }
}

It outputs:

fmt: 03-Aug-2000

While I need the Month to be July, as I have set the month to 7?

sinsedrix
  • 4,336
  • 4
  • 29
  • 53
A Par
  • 17
  • 1
  • 2
  • 4

5 Answers5

8

My guess, is that you're expecting the 7th month to be July, but the month value is 0-based, so July would be represented by a 6.

month - the value used to set the MONTH calendar field in the calendar. Month value is 0-based. e.g., 0 for January.

You also probably want to enter the 4-digit date

You'd end up with the following

GregorianCalendar fmt = new GregorianCalendar(1975, 6, 3);

Here's the documentation for GregorianCalendar

7

As noted by other people, there are two problems in your current code:

  • Months are zero based. So, month 7 is August, not July =\
  • Year doesn't start by default at 1900 but at 1970, but if you set the year by yourself you'll get as year the same number you're setting, in this case, 75 (not 1975 as expected).

To solve this, you may create the GregorianCaledar as new GregorianCaledar(1975, 6, 3). Or even better, stop working directly with this class and instead use the abstract class Calendar:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, 1975);
calendar.set(Calendar.MONTH, Calendar.JULY);
calendar.set(Calendar.DATE, 3);
SimpleDateFormat df = new SimpleDateFormat("dd-MMM-yyyy");
String result = df.format(calendar.getTime());
System.out.println("fmt: " + result);

Why to use Calendar instead of GregorianCalendar? Because you should always work with abstract class/interface instead of class implementation.

Community
  • 1
  • 1
Luiggi Mendoza
  • 85,076
  • 16
  • 154
  • 332
3

Of course,

You have instantiated the GregorianCalendar to year 75.

What was your purpose?

See the API

http://docs.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html

Also pay attention that in GregorianCalendar the month start from 0

Taken from the JavaDoc above:

"month - the value used to set the MONTH calendar field in the calendar. Month value is 0-based. e.g., 0 for January."

Uri Lukach
  • 1,093
  • 1
  • 14
  • 28
3

In the GregorianCalendar months are marked from 0 (which represents January), and so do the years. So if you want to represent July 3rd, 1975, you should use:

GregorianCalendar fmt = new GregorianCalendar(1975, 6, 3);
Mureinik
  • 297,002
  • 52
  • 306
  • 350
0

tl;dr

LocalDate.of( 2000 , 7 , 3 )

…or…

LocalDate.of( 2000 , Month.JULY , 3 )

java.time

As already noted, the troublesome old GregorianCalendar has crazy numbering schemes with year, month, and day-of-week. Months are numbered 0-11 for January-December, so August is # 7 rather than # 8. Avoid these old legacy classes like the Plague. Instead, use the modern java.time classes.

Te java.time classes use sane numbering:

  • 2014 means the year 2014. No funky math with 1900.
  • 2 means February, 1-12 for January-December.
  • 1 means Monday, 1-7 for Monday-Sunday per [ISO 8601][1] standard.

LocalDate

The LocalDate class represents a date-only value without time-of-day and without time zone.

A time zone is crucial in determining a date. For any given moment, the date varies around the globe by zone. For example, a few minutes after midnight in Paris France is a new day while still “yesterday” in Montréal Québec.

If no time zone is specified, the JVM implicitly applies its current default time zone. That default may change at any moment, so your results may vary. Better to specify your desired/expected time zone explicitly as an argument.

Specify a proper time zone name in the format of continent/region, such as America/Montreal, Africa/Casablanca, or Pacific/Auckland. Never use the 3-4 letter abbreviation such as EST or IST as they are not true time zones, not standardized, and not even unique(!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

If you want to use the JVM’s current default time zone, ask for it and pass as an argument. If omitted, the JVM’s current default is applied implicitly. Better to be explicit, as the default may be changed at any moment during runtime by any code in any thread of any app within the JVM.

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

Or specify a date. You may set the month by a number, with sane numbering 1-12 for January-December.

LocalDate ld = LocalDate.of( 2000 , 7 , 3 ) ;  // Years use sane direct numbering (2014 means year 2014). Months use sane numbering, 1-12 for January-December.

Or, better, use the Month enum objects pre-defined, one for each month of the year. Tip: Use these Month objects throughout your codebase rather than a mere integer number to make your code more self-documenting, ensure valid values, and provide type-safety.

LocalDate ld = LocalDate.of( 2000 , Month.JULY , 3 ) ;

Generate a String in your desired format. Note the Locale argument used to specify the human language and cultural norms to be used in localizing.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MMM-uuuu" , Locale.US ) ;
String output = ld.format( f ) ;

03-Jul-2000


About java.time

The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.

Where to obtain the java.time classes?

The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.

Basil Bourque
  • 303,325
  • 100
  • 852
  • 1,154