Java's java.util.Calendar
class is used to do date and time arithmetic. Whenever you have something slightly more advanced than just representing a date and time, this is the class to use.
Java only comes with a Gregorian
calendar implementation, the java.util.GregorianCalendar
class. Here is how you instantiate a GregorianCalendar
:
Calendar calendar = new GregorianCalendar();
The Calendar
class has a couple of methods you can use to access the year, month, day, hour, minutes, seconds, milliseconds and time zone of a given date. Here are a few examples showing how that is done:
Calendar calendar = new GregorianCalendar(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // Jan = 0, not 1 int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR); int weekOfMonth= calendar.get(Calendar.WEEK_OF_MONTH); int hour = calendar.get(Calendar.HOUR); // 12 hour clock int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY); // 24 hour clock int minute = calendar.get(Calendar.MINUTE); int second = calendar.get(Calendar.SECOND); int millisecond = calendar.get(Calendar.MILLISECOND);
The MONTH
field of the Calendar
class does not go from 1 to 12 like they do when we write dates otherwise. Instead the months run from 0 to 11, where 0 is January and 11 is December.
The day of week runs from 1 to 7 as you might expect, but sunday, not monday is the first day of the week. That means that 1 = sunday, 2 = monday, ..., 7 = saturday.
How to add/subtract year, months, days, hour, minutes
Java’s Calendar
class provides a set of methods for manipulation of temporal information. In addition to fetch the system’s current date and time, it also enables functionality for date and time arithmetic.
Calendar cal = new GregorianCalendar(2017, Calendar.JUNE, 2); // add 4 months and 5 days cal.add(Calendar.MONTH, 4); cal.add(Calendar.DAY_OF_MONTH, 5); // add 3 hours and 34 minute cal.add(Calendar.HOUR, 3); cal.add(Calendar.MINUTE, 34); // subtract 4 months,5 days,12 hours and 24 minutes cal.add(Calendar.MONTH, -4); cal.add(Calendar.DAY_OF_MONTH, -5); cal.add(Calendar.HOUR, -12); cal.add(Calendar.MINUTE, -24);
How to get current timestamp
//Date object Date date= new Date(); //getTime() returns current time in milliseconds long timeMilli1 = date.getTime(); Calendar calendar = Calendar.getInstance(); long timeMilli2 = calendar.getTimeInMillis(); long timeMili3 = System.currentTimeMillis();
Date comparison
// Initialization Calendar startDate = Calendar.getInstance(); startDate.set(2013, 11, 25); Calendar endDate = Calendar.getInstance(); endDate.set(2013, 11, 27); // Check if startDate is equal to endDate startDate.equals(endDate) // Check if startDate is less than endDate startDate.before(endDate) // check if startDate is greater than endDate startDate.after(endDate)
Difference between two dates
Difference between two dates using TimeUnit
and Calendar
.
Calendar calStart = Calendar.getInstance(); calStart.set(2013, 11, 25); Calendar calEnd = Calendar.getInstance(); calEnd.set(2013, 11, 27); Date dateStart = calStart.getTime(); Date dateEnd = calEnd.getTime(); long timeDiff = Math.abs(dateEnd.getTime() - dateStart.getTime()); String diff = String.format("%d hour(s) %d min(s)", TimeUnit.MILLISECONDS.toHours(timeDiff), TimeUnit.MILLISECONDS.toMinutes(timeDiff) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(timeDiff))); System.out.println(diff);
Difference between two dates using Calendar
.
// import java.util.Calendar; Calendar cal1 = Calendar.getInstance(); Calendar cal2 = Calendar.getInstance(); // Set the date for both of the calendar instance cal1.set(2016, Calendar.DECEMBER, 30); cal2.set(2017, Calendar.MAY, 3); // Get the represented date in milliseconds long millis1 = cal1.getTimeInMillis(); long millis2 = cal2.getTimeInMillis(); // Calculate difference in milliseconds long diff = millis2 - millis1; // Calculate difference in seconds long diffSeconds = diff / 1000; // Calculate difference in minutes long diffMinutes = diff / (60 * 1000); // Calculate difference in hours long diffHours = diff / (60 * 60 * 1000); // Calculate difference in days long diffDays = diff / (24 * 60 * 60 * 1000); System.out.println("In milliseconds: " + diff + " milliseconds."); System.out.println("In seconds: " + diffSeconds + " seconds."); System.out.println("In minutes: " + diffMinutes + " minutes."); System.out.println("In hours: " + diffHours + " hours."); System.out.println("In days: " + diffDays + " days.");
Difference between two dates using LocalDate
(JDK 8), Month
and Period
.
//import java.time.LocalDate; //import java.time.Month; //import java.time.Period; LocalDate dateFrom = LocalDate.of(2016, Month.JULY, 12); LocalDate dateTo = LocalDate.of(2017, Month.AUGUST, 22); Period intervalPeriod = Period.between(dateFrom, dateTo); System.out.println("Difference of days: " + intervalPeriod.getDays()); System.out.println("Difference of months: " + intervalPeriod.getMonths()); System.out.println("Difference of years: " + intervalPeriod.getYears());
Difference between two dates using LocalDate
(JDK 8), Month
and ChronoUnit
.
//import java.time.LocalDate; //import java.time.Month; //import java.time.temporal.ChronoUnit; LocalDate dateFrom = LocalDate.of(2016, Month.JULY, 12); LocalDate dateTo = LocalDate.of(2017, Month.AUGUST, 22); long intervalYears = ChronoUnit.YEARS.between(dateFrom, dateTo); System.out.println("Total number of years between dates: " + intervalYears); long intervalMonths = ChronoUnit.MONTHS.between(dateFrom, dateTo); System.out.println("Total number of months between dates: " + intervalMonths); long intervalDays = ChronoUnit.DAYS.between(dateFrom, dateTo); System.out.println("Total number of days between dates:" + intervalDays);
Difference between two dates using LocalDate
from Joda-Time library.
LocalDate date1 = new LocalDate(2015, 7, 30); LocalDate date2 = new LocalDate(2017, 5, 19); int monthsBetween = Months.monthsBetween(date1, date2).getMonths(); int yearsBetween = Years.yearsBetween(date1, date2).getYears();
Difference between two dates with Joda-time library.
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.joda.time.Interval; import org.joda.time.Period; public class JodaTest { public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat("dd/M/yyyy HH:mm:ss"); try { Date startDate = sdf.parse("25/11/2013 21:45:05"); Date endDate = sdf.parse("27/11/2013 23:03:12"); Interval interval = new Interval(startDate.getTime(), endDate.getTime()); Period period = interval.toPeriod(); System.out.printf("%d days, %d hours, %d minutes, %d seconds%n", period.getDays(), period.getHours(), period.getMinutes(), period.getSeconds()); System.out.println(period.getMonths()); } catch (ParseException e) { e.printStackTrace(); } } }
Run with this command
javac -cp joda-time-2.3.jar JodaTest.java && java -cp .:joda-time-2.3.jar JodaTest
Date formation
The DateFormat
class provides APIs for formatting time and date in a custom format.
String frmt = "MM/dd/yy HH:mm"; Date today = new Date(); DateFormat.format(frmt, today);
In this snippet we will use Calendar
and SimpleDateFormate
class to format current date.
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); Calendar c = Calendar.getInstance(); String date1 = sdf.format(c.getTime()); String date2 = sdf.format(new Date());
We can use Calendar
class to get current date in another way.
Calendar c = Calendar.getInstance(); int day = c.get(Calendar.DAY_OF_MONTH); int month = c.get(Calendar.MONTH); int year = c.get(Calendar.YEAR); String date = day + "/" + (month+1) + "/" + year;
How to convert String to Date
You can parse a String
into a java.util.Date
instance using the parse(
) method of the SimpleDateFormat
instance. Here is an example:
Date date = null; DateFormat df = new SimpleDateFormat("dd-MM-yyyy"); try { date = df.parse("02-07-2017"); } catch (Exception e){ System.out.println(e); }
Useful links