Category Archives: Time

JAVA : Daylight Saving Time (DST) Handling


Pre-Requisite : Java : Date and Time Handling Tutorial

Most of the United States practice of advancing clock during summer month in order to leverage an additional hour of natural light(saving heating power, illumination power, enhancing the mood, and so on).

When clocks change time

In United States Daylight Saving Time begins at 2:00 a.m. on the second Sunday in March and reverts to standard time on the first Sunday in November. In United States each time zone switches clocks at different time.

Daylight Saving Time on time zone

In United States , When Daylight Saving Time are being followed in EST then it’s become EDT. These names just are abbreviation and having different meaning in different continents.
Ex:

  • IST : Indian Standard Time
  • IST : Irish Standard Time
  • IST : Israel Standard Time

For United States (Follow Day Light Saving)

Standard Time Daylight Savings Time
CST : Central Standard Time (North America) CDT : Central Daylight Time
EST : Eastern Standard Time (North America) EDT : Eastern Daylight Time
PST : Pacific Standard Time (North America) PDT : Pacific Daylight Time

Complete List of timezone abbreviations

Note : The 3-letter abbreviations should be wholeheartedly avoided in favor of TZDB zone IDs. EST is not time zone such 3-4 letter codes are neither standardized nor unique, and further the confusion over Daylight saving time (DST). Whenever need to set time zone in code in the code always use proper time zone name in the “continent/region” format.

Complete List of time zone with continent/region

Example of Daylight Saving Time with Time Zone

In this example cover all the case for applying Daylight Saving Time on different time zone. Here I have try to apply with abbreviation, continent / region and show with standard time and Daylight saving time.

package datetime;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.ZoneId;
import java.util.Date;
import java.util.TimeZone;

public class DayLightSavingExample {

	public static void main(String[] args) {
	/**
	* DST = Daylight Saving Time (Begins Daylight Saving Time at 2:00 a.m.
	* on the second Sunday in March and reverts to standard time on the
	* first Sunday in November)
	*/
	SimpleDateFormat sourceFormat = new SimpleDateFormat("MM/dd/yyyy");
	SimpleDateFormat targetFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'+|-hh:mm");
	String strWithDLS = "03/10/2019"; // MM/DD/YYYY
	String strWithOutDLS = "03/11/2019";
	try {
	     Date dateWithDLS = sourceFormat.parse(strWithDLS);
	     Date dateWithOutDLS = sourceFormat.parse(strWithOutDLS);
		System.out.println("Default Timezone with Day Light Saving :" + targetFormat.format(dateWithDLS));
		System.out.println("Default Timezone without Day Light Saving :" + targetFormat.format(dateWithOutDLS));

		/**
		* Set time zone with EST (No difference in time) because 3 letter
		* time zone not consider DST (Day light saving time)
		*/
		sourceFormat.setTimeZone(TimeZone.getTimeZone("EST"));
		dateWithDLS = sourceFormat.parse(strWithDLS);
		dateWithOutDLS = sourceFormat.parse(strWithOutDLS);
		System.out.println("EST Timezone with Day Light Saving :" + targetFormat.format(dateWithDLS));
		System.out.println("EST Timezone without Day Light Saving :" + targetFormat.format(dateWithOutDLS));

		/**
		* Set time zone with America/New_York (1 hour difference in time)
		* when you need to use day light saving always use with
		* continent/region format.
		*/
			sourceFormat.setTimeZone(TimeZone.getTimeZone(ZoneId.of("America/New_York")));
dateWithDLS = sourceFormat.parse(strWithDLS);
dateWithOutDLS = sourceFormat.parse(strWithOutDLS);
System.out.println("America/New_York Timezone with Day Light Saving :" + targetFormat.format(dateWithDLS));
System.out.println(
"America/New_York Timezone without Day Light Saving :" + targetFormat.format(dateWithOutDLS));

} catch (ParseException ex) {
			ex.printStackTrace();
}

	}

}

Output :


Default Timezone with Day Light Saving :2019-03-10T00:00:00Z+|-12:00
Default Timezone without Day Light Saving :2019-03-11T00:00:00Z+|-12:00
EST Timezone with Day Light Saving :2019-03-10T10:30:00Z+|-10:30
EST Timezone without Day Light Saving :2019-03-11T10:30:00Z+|-10:30
America/New_York Timezone with Day Light Saving :2019-03-10T10:30:00Z+|-10:30
America/New_York Timezone without Day Light Saving :2019-03-11T09:30:00Z+|-09:30

 

Here i have tried to cover all the points as developer prospects. If you know more ways to handle it and any issues related to date and time please suggest in comments.

Advertisements

Java 8+ Date Time Exmples


Pre-Requisite : Java Date and Time Tutorial

In this below example try to cover all possible cases and operations with date and time with Java 8+ APIs.

import java.time.DateTimeException;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;
import java.time.Period;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAdjusters;
import java.time.zone.ZoneRulesException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

public class Java8DateTime {

	public static void main(String[] args) {
		//LocalDate lastDay_2014 = LocalDate.of(2014, 12, 32);
		//LocalTime lastDay_2014 = LocalTime.of(12, 12, 23,-1);
		currentDateTime();
		instantAPI();
		GregorianCalendarAPI();
		TimeZoneAPI();
		dateTimeFormattingAndParsing();
		localDateAPI();
		localDateTimeAPI();
		localTimeAPI();

		System.out.println("*********Set Date and Time Manually***************");
		LocalDateTime dateTimePoint=LocalDateTime.now();
		// Set Date and Time manually
		LocalDate datePoint = LocalDate.of(2012, Month.DECEMBER, 12);
		System.out.println("Local Date :" + datePoint);
		// Days after 1970
		datePoint = LocalDate.ofEpochDay(150);
		System.out.println("Local Date :" + datePoint);
		// set String
		LocalTime timePoint = LocalTime.parse("10:15:30");
		System.out.println("Local Time :" + timePoint);
		// Set hours and minutes
		timePoint = LocalTime.of(13, 18);
		System.out.println("Local Time :" + timePoint);

		// Retrieve values
		System.out.println("*********Get Date and Time Values***************");
		datePoint = dateTimePoint.toLocalDate();
		Month month = dateTimePoint.getMonth();
		int day = dateTimePoint.getDayOfMonth();
		int year = dateTimePoint.getYear();
		int hour = dateTimePoint.getHour();
		int minute = dateTimePoint.getMinute();
		int second = dateTimePoint.getSecond();
		System.out.println("Local Date :" + datePoint);
		System.out.printf("Local Date time Format : %d/%d/%d %d:%d:%d", day, month.getValue(), year, hour, minute,
				second);
		System.out.println();
		System.out.println("*********Operation On LocalDate***************");
		// Operation on Local Date
		// Period of 1 year 3 month 2 days
		Period period = Period.of(1, 3, 2);
		LocalDate startDatePoint = datePoint.minus(period);
		System.out.println("Local Date :" + startDatePoint);
		LocalDate endDatePoint = datePoint.plus(period);
		System.out.println("Local Date :" + endDatePoint);

		System.out.println("*********Diffrence of On LocalDate***************");
		// Difference of Date
		Period daysPeriod = Period.between(startDatePoint, endDatePoint);
		System.out.println("Days :" + daysPeriod.getDays());
		System.out.println("Months :" + daysPeriod.getMonths());
		System.out.println("Years :" + daysPeriod.getYears());
		// Another Way
		long days = ChronoUnit.DAYS.between(startDatePoint, endDatePoint);
		long months = ChronoUnit.MONTHS.between(startDatePoint, endDatePoint);
		long years = ChronoUnit.YEARS.between(startDatePoint, endDatePoint);
		System.out.println("Days :" + days);
		System.out.println("Months :" + months);
		System.out.println("Years :" + years);

		// Duration

		// A duration of 3 seconds and 5 nanoseconds
		Duration duration = Duration.ofSeconds(3, 5);
		// Duration oneDay = Duration.between(Temporal., yesterday);

	}

	private static void currentDateTime() {
		System.out.println("*********Current Date and Time***************");

		// Current Date and Time
		LocalDateTime dateTimePoint = LocalDateTime.now();
		System.out.println("Local Date Time :" + dateTimePoint);
		// Current Date
		LocalDate datePoint = LocalDate.now();
		System.out.println("Local Date :" + datePoint);
		// Current Time
		LocalTime timePoint = LocalTime.now();
		System.out.println("Local Time :" + timePoint);

		// Get Instant from java.util.Date
		Instant timestamp = new Date().toInstant();
		System.out.println("Current Timestamp = " + timestamp);

		// java.util.Calendar to Instant
		Instant time = Calendar.getInstance().toInstant();
		System.out.println(time);
	}

	private static void instantAPI() {
		System.out.println("*****************Instant API*******************");
		// Date to Instant
		Instant timestamp = new Date().toInstant();
		System.out.println("Current Timestamp = " + timestamp);
		// Now we can convert Instant to LocalDateTime or other similar classes
		LocalDateTime date = LocalDateTime.ofInstant(timestamp, ZoneId.of(ZoneId.SHORT_IDS.get("PST")));
		System.out.println("Date = " + date);

		// Calendar to Instant
		Instant time = Calendar.getInstance().toInstant();
		System.out.println(time);

		// Date API to Legacy classes
		Date dt = Date.from(Instant.now());
		System.out.println(dt);

		// Instant from timestamp
		Instant specificTime = Instant.ofEpochMilli(timestamp.toEpochMilli());
		System.out.println("Specific Time = " + specificTime);

		// Duration example
		Duration thirtyDay = Duration.ofDays(30);
		System.out.println(thirtyDay);
	}

	private static void localDateAPI() {
		System.out.println("*****************Local Date API*******************");
		LocalDate today = LocalDate.now();

		System.out.println("Current Date=" + today);

		// Creating LocalDate by providing input parameters.
		// Here are chnaces of getting DateTimeException if pass as Invalidate
		// Date format
		LocalDate firstDay_2016 = LocalDate.of(2016, Month.JANUARY, 1);
		System.out.println("Specific Date=" + firstDay_2016);

		try {
			// Here with throw DateTimeException if pass as Invalidate Date
			// format
			LocalDate lastDay_2014 = LocalDate.of(2014, Month.FEBRUARY, 29);
			System.out.println("Specific Date=" + lastDay_2014);
		} catch (DateTimeException ex) {
			ex.printStackTrace();
		}

		// Current date in "Asia/Kolkata", you can get it from ZoneId
		LocalDate todayKolkata = LocalDate.now(ZoneId.of("Asia/Kolkata"));
		System.out.println("Current Date in CST=" + todayKolkata);

		try
		{
		// Will throw java.time.zone.ZoneRulesException: Unknown time-zone ID: IST
		LocalDate todayIST = LocalDate.now(ZoneId.of("IST"));
		}
		catch(ZoneRulesException ex)
		{
			ex.printStackTrace();
		}

		// Getting date from the base date i.e 01/01/1970
		LocalDate dateFromBase = LocalDate.ofEpochDay(365);
		System.out.println("365th day from base date= " + dateFromBase);

        //Get 100 th day of year
		LocalDate hundredDay2014 = LocalDate.ofYearDay(2016, 100);
		System.out.println("100th day of 2014=" + hundredDay2014);

		//Other APIs and Operation on LocalDate

		// Get the Year, check if it's leap year
		System.out.println("Year " + today.getYear() + " is Leap Year? " + today.isLeapYear());

		// Compare two LocalDate for before and after
		System.out.println("Today is before 01/01/2017? " + today.isBefore(LocalDate.of(2017, 1, 1)));

		// Get LocalDateTime from LocalDate
		System.out.println("Current Time=" + today.atTime(LocalTime.now()));

		// plus and minus operations
		System.out.println("20 days after today will be " + today.plusDays(20));
		System.out.println("5 weeks after today will be " + today.plusWeeks(5));
		System.out.println("30 months after today will be " + today.plusMonths(30));

		System.out.println("20 days before today will be " + today.minusDays(20));
		System.out.println("5 weeks before today will be " + today.minusWeeks(5));
		System.out.println("30 months before today will be " + today.minusMonths(30));

		// TemporalAdjusters for adjusting the dates
		LocalDate firstDayOfMonth=today.with(TemporalAdjusters.firstDayOfMonth());
		System.out.println("First date of this month= " + firstDayOfMonth);

		LocalDate lastDayOfYear = today.with(TemporalAdjusters.lastDayOfYear());
		System.out.println("Last date of this year= " + lastDayOfYear);

		Period period = today.until(lastDayOfYear);
		System.out.println("Period Format= " + period);
		System.out.println("Months remaining in the year= " + period.getMonths());

	}

	private static void localTimeAPI() {
		System.out.println("*****************Local Time API*******************");
		// Current Time
		LocalTime time = LocalTime.now();
		System.out.println("Current Time=" + time);

		// Creating LocalTime by providing input arguments
		LocalTime specificTime = LocalTime.of(12, 20, 25, 40);
		System.out.println("Specific Time of Day=" + specificTime);

		// Try creating time by providing invalid inputs
		// LocalTime invalidTime = LocalTime.of(25,20);
		// Exception in thread "main" java.time.DateTimeException:
		// Invalid value for HourOfDay (valid values 0 - 23): 25

		// Current date in "Asia/Kolkata", you can get it from ZoneId javadoc
		LocalTime timeKolkata = LocalTime.now(ZoneId.of("Asia/Kolkata"));
		System.out.println("Current Time in IST=" + timeKolkata);

		// java.time.zone.ZoneRulesException: Unknown time-zone ID: IST
		// LocalTime todayIST = LocalTime.now(ZoneId.of("IST"));

		// Getting date from the base date i.e 01/01/1970
		LocalTime specificSecondTime = LocalTime.ofSecondOfDay(10000);
		System.out.println("10000th second time= " + specificSecondTime);

	}

	private static void localDateTimeAPI() {
		System.out.println("*****************Local Date Time API*******************");
		// Current Date
		LocalDateTime today = LocalDateTime.now();
		System.out.println("Current DateTime=" + today);

		// Current Date using LocalDate and LocalTime
		today = LocalDateTime.of(LocalDate.now(), LocalTime.now());
		System.out.println("Current DateTime=" + today);

		// Creating LocalDateTime by providing input arguments
		LocalDateTime specificDate = LocalDateTime.of(2014, Month.JANUARY, 1, 10, 10, 30);
		System.out.println("Specific Date=" + specificDate);

		// Try creating date by providing invalid inputs
		// LocalDateTime feb29_2014 = LocalDateTime.of(2014, Month.FEBRUARY, 28,
		// 25,1,1);
		// Exception in thread "main" java.time.DateTimeException:
		// Invalid value for HourOfDay (valid values 0 - 23): 25

		// Current date in "Asia/Kolkata", you can get it from ZoneId javadoc
		LocalDateTime todayKolkata = LocalDateTime.now(ZoneId.of("Asia/Kolkata"));
		System.out.println("Current Date in IST=" + todayKolkata);

		// java.time.zone.ZoneRulesException: Unknown time-zone ID: IST
		// LocalDateTime todayIST = LocalDateTime.now(ZoneId.of("IST"));

		// Getting date from the base date i.e 01/01/1970
		LocalDateTime dateFromBase = LocalDateTime.ofEpochSecond(10000, 0, ZoneOffset.UTC);
		System.out.println("10000th second time from 01/01/1970= " + dateFromBase);

	}

	private static void dateTimeFormattingAndParsing() {
		System.out.println("*****************Local DateTime Formatting API*******************");
		// Format examples
		LocalDate date = LocalDate.now();
		// default format
		System.out.println("Default format of LocalDate=" + date);
		// specific format
		System.out.println(date.format(DateTimeFormatter.ofPattern("d::MMM::uuuu")));
		System.out.println(date.format(DateTimeFormatter.BASIC_ISO_DATE));

		LocalDateTime dateTime = LocalDateTime.now();
		// default format
		System.out.println("Default format of LocalDateTime=" + dateTime);
		// specific format
		System.out.println(dateTime.format(DateTimeFormatter.ofPattern("d::MMM::uuuu HH::mm::ss")));
		System.out.println(dateTime.format(DateTimeFormatter.BASIC_ISO_DATE));

		Instant timestamp = Instant.now();
		// default format
		System.out.println("Default format of Instant=" + timestamp);

		// Parse examples
		LocalDateTime dt = LocalDateTime.parse("27::Apr::2014 21::39::48",
				DateTimeFormatter.ofPattern("d::MMM::uuuu HH::mm::ss"));
		System.out.println("Default format after parsing = " + dt);

	}

	private static void GregorianCalendarAPI() {
		System.out.println("*****************Gregorian Calendar API*******************");
		// ZonedDateTime from specific Calendar
		ZonedDateTime gregorianCalendarDateTime = new GregorianCalendar().toZonedDateTime();
		System.out.println(gregorianCalendarDateTime);

		GregorianCalendar gc = GregorianCalendar.from(gregorianCalendarDateTime);
		System.out.println(gc);
	}

	private static void TimeZoneAPI() {
		System.out.println("*****************Time Zone API*******************");
		// TimeZone to ZoneId
		ZoneId defaultZone = TimeZone.getDefault().toZoneId();
		System.out.println(defaultZone);

		TimeZone tz = TimeZone.getTimeZone(defaultZone);
		System.out.println(tz);

	}

}

Output


*********Current Date and Time***************
Local Date Time :2019-05-16T11:50:59.302
Local Date :2019-05-16
Local Time :11:50:59.303
Current Timestamp = 2019-05-16T06:20:59.303Z
2019-05-16T06:20:59.358Z
*****************Instant API*******************
Current Timestamp = 2019-05-16T06:20:59.369Z
Date = 2019-05-15T23:20:59.369
2019-05-16T06:20:59.373Z
Thu May 16 11:50:59 IST 2019
Specific Time = 2019-05-16T06:20:59.369Z
PT720H
*****************Gregorian Calendar API*******************
2019-05-16T11:50:59.387+05:30[Asia/Calcutta]
java.util.GregorianCalendar[time=1557987659387,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Calcutta",offset=19800000,dstSavings=0,useDaylight=false,transitions=7,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2019,MONTH=4,WEEK_OF_YEAR=20,WEEK_OF_MONTH=3,DAY_OF_MONTH=16,DAY_OF_YEAR=136,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=3,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=50,SECOND=59,MILLISECOND=387,ZONE_OFFSET=19800000,DST_OFFSET=0]
*****************Time Zone API*******************
Asia/Calcutta
sun.util.calendar.ZoneInfo[id="Asia/Calcutta",offset=19800000,dstSavings=0,useDaylight=false,transitions=7,lastRule=null]
*****************Local DateTime Formatting API*******************
Default format of LocalDate=2019-05-16
16::May::2019
20190516
Default format of LocalDateTime=2019-05-16T11:50:59.551
16::May::2019 11::50::59
20190516
Default format of Instant=2019-05-16T06:20:59.551Z
Default format after parsing = 2014-04-27T21:39:48
*****************Local Date API*******************
Current Date=2019-05-16
Specific Date=2016-01-01
java.time.DateTimeException: Invalid date 'February 29' as '2014' is not a leap year
Current Date in CST=2019-05-16
365th day from base date= 1971-01-01
    at java.time.LocalDate.create(Unknown Source)
    at java.time.LocalDate.of(Unknown Source)
    at datetime.Java8DateTime.localDateAPI(Java8DateTime.java:160)
    at datetime.Java8DateTime.main(Java8DateTime.java:34)
java.time.zone.ZoneRulesException: Unknown time-zone ID: IST
    at java.time.zone.ZoneRulesProvider.getProvider(Unknown Source)
    at java.time.zone.ZoneRulesProvider.getRules(Unknown Source)
    at java.time.ZoneRegion.ofId(Unknown Source)
    at java.time.ZoneId.of(Unknown Source)
    at java.time.ZoneId.of(Unknown Source)
    at datetime.Java8DateTime.localDateAPI(Java8DateTime.java:173)
    at datetime.Java8DateTime.main(Java8DateTime.java:34)
100th day of 2014=2016-04-09
Year 2019 is Leap Year? false
Today is before 01/01/2017? false
Current Time=2019-05-16T11:50:59.619
20 days after today will be 2019-06-05
5 weeks after today will be 2019-06-20
30 months after today will be 2021-11-16
20 days before today will be 2019-04-26
5 weeks before today will be 2019-04-11
30 months before today will be 2016-11-16
First date of this month= 2019-05-01
Last date of this year= 2019-12-31
Period Format= P7M15D
Months remaining in the year= 7
*****************Local Date Time API*******************
Current DateTime=2019-05-16T11:50:59.620
Current DateTime=2019-05-16T11:50:59.620
Specific Date=2014-01-01T10:10:30
Current Date in IST=2019-05-16T11:50:59.620
10000th second time from 01/01/1970= 1970-01-01T02:46:40
*****************Local Time API*******************
Current Time=11:50:59.620
Specific Time of Day=12:20:25.000000040
Current Time in IST=11:50:59.620
10000th second time= 02:46:40
*********Set Date and Time Manually***************
Local Date :2012-12-12
Local Date :1970-05-31
Local Time :10:15:30
Local Time :13:18
*********Get Date and Time Values***************
Local Date :2019-05-16
Local Date time Format : 16/5/2019 11:50:59
*********Operation On LocalDate***************
Local Date :2018-02-14
Local Date :2020-08-18
*********Difference of On LocalDate***************
Days :4
Months :6
Years :2
Days :916
Months :30
Years :2

Above solutions are my search to perform all type of operations with date and time with java 8 API generally face while development. If you face other issue apart from it. Please mention in comments that will help with others.

[Solved] Date Format : java.text.ParseException: Unparseable date: “yyyy-MM-ddThh:mm:ss.SSSZ”


SimpleDateFormat throw java.text.ParseException exception when passing date for parsing not match with formatting pattern.

java.text.ParseException is runtime unchecked exception which signals that an error has been reached unexpectedly while parsing.

Constructors

  • ParseException (String message, int errorOffset) : Constrcut a ParseException with the specified detail message and offset. A detail message is a String that describes this particular exception. where errorOffset : is the position where error occurred.

Methods

  • public int getErrorOffset() :Returns the position where the error was found.

Example SimpleDateFormat throw ParseException

In this example currentFormat is matching with date passed in sourceDate that’s what failing with parse exception.

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class ChangeDateFormat {

	public static void main(String[] args) {
		String targetFormat = "MM/DD/YYYY hh:mm:ss a";
		String currentFormat = "yyyy-MM-dd'T'hh:mm:ss'Z'";
		String sourceDate = "2019-02-12T11:29:10.761Z";
		System.out.println("Source Date :"+sourceDate);
		String timezone = "CDT";
		DateFormat srcDf = new SimpleDateFormat(currentFormat);
		srcDf.setTimeZone(TimeZone.getTimeZone(timezone));
		DateFormat destDf = new SimpleDateFormat(targetFormat);
		try {
			Date date = srcDf.parse(sourceDate);
			String targetDate = destDf.format(date);
			System.out.println("Target Date :"+targetDate);

		} catch (ParseException ex) {
			ex.printStackTrace();
		}

	}

}

Output:


Source Date :2019-02-12T11:29:10.761Z
java.text.ParseException: Unparseable date: "2019-02-12T11:29:10.761Z"
    at java.text.DateFormat.parse(Unknown Source)
    at com.fiot.test.ChangeDateFormat.main(ChangeDateFormat.java:21)

Solutions

To resolve this issue date format should be same as passing source date.

Correct Format for Date is yyyy-MM-dd’T’hh:mm.ss.SS’Z’

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class ChangeDateFormat {

	public static void main(String[] args) {
		String targetFormat = "MM/DD/YYYY hh:mm:ss a";
		String currentFormat = "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'";
		String sourceDate = "2019-02-12T11:29:10.761Z";
		System.out.println("Source Date :"+sourceDate);
		String timezone = "CDT";
		DateFormat srcDf = new SimpleDateFormat(currentFormat);
		srcDf.setTimeZone(TimeZone.getTimeZone(timezone));
		DateFormat destDf = new SimpleDateFormat(targetFormat);
		try {
			Date date = srcDf.parse(sourceDate);
			String targetDate = destDf.format(date);
			System.out.println("Target Date :"+targetDate);

		} catch (ParseException ex) {
			ex.printStackTrace();
		}

	}

}

Output:


Source Date :2019-02-12T11:29:10.761Z
java.text.ParseException: Unparseable date: "2019-02-12T11:29:10.761Z"
    at java.text.DateFormat.parse(Unknown Source)
    at com.fiot.test.ChangeDateFormat.main(ChangeDateFormat.java:21)

More Issues Solution

To solved Date Time same code , formatting  and issues solutions follow the link given below:

Java Date and Time Handling Tutorial

[Solved] Date Format : java.lang.IllegalArgumentException: Illegal pattern character ‘Z’ or ‘T’


SimpleDateFormat throw java.lang.IllegalArgumentException at runtime while parsing date format.

Follow link below to get in depth knowledge of IllegalArgumentException .

[Solved] java.lang.IllegalArgumentException: “ABC”

Example DateTime throwing IllegalArgumentexception

In this example target format is throwing IllegalArgumentException because of using illegal pattern character as Z and T.

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class ChangeDateFormat {

	public static void main(String[] args) {
		String targetFormat = "MM/DD/YYYY hh:mm:ss a";
		String currentFormat = "yyyy-MM-ddThh:mm:ss.SSSZ";
		String sourceDate = "2019-02-12T11:29:10.761Z";
		System.out.println("Source Date :"+sourceDate);
		String timezone = "CDT";
		DateFormat srcDf = new SimpleDateFormat(currentFormat);
		srcDf.setTimeZone(TimeZone.getTimeZone(timezone));
		DateFormat destDf = new SimpleDateFormat(targetFormat);
		try {
			Date date = srcDf.parse(sourceDate);
			String targetDate = destDf.format(date);
			System.out.println("Target Date :"+targetDate);

		} catch (ParseException ex) {
			ex.printStackTrace();
		}

	}

}

Output :


Source Date :2019-02-12T11:29:10.761Z
Exception in thread "main" java.lang.IllegalArgumentException: Illegal pattern character 'T'
    at java.text.SimpleDateFormat.compile(Unknown Source)
    at java.text.SimpleDateFormat.initialize(Unknown Source)
    at java.text.SimpleDateFormat.(Unknown Source)
    at java.text.SimpleDateFormat.(Unknown Source)
    at com.fiot.test.ChangeDateFormat.main(ChangeDateFormat.java:17)

Solutions

SimpleDateFormat allow only some key characters only while using date time formatting. Here using characters Z and T for matching date time pattern in sourceDate that what throwing IllegalArgumentException . To resolve such issues for using  characters apart from formatting char in date format always use with ‘Z’ or ‘T’ (with single quote) as given below. Follow link to see complete list for formatting characters and date format.

Date Time Formatting Characters and Patterns

Correct Date Time Format
"yyyy-MM-dd'T'hh:mm:ss.SSS'Z'"

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class ChangeDateFormat {

	public static void main(String[] args) {
		String targetFormat = "MM/DD/YYYY hh:mm:ss a";
		String currentFormat = "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'";
		String sourceDate = "2019-02-12T11:29:10.761Z";
		System.out.println("Source Date :"+sourceDate);
		String timezone = "CDT";
		DateFormat srcDf = new SimpleDateFormat(currentFormat);
		srcDf.setTimeZone(TimeZone.getTimeZone(timezone));
		DateFormat destDf = new SimpleDateFormat(targetFormat);
		try {
			Date date = srcDf.parse(sourceDate);
			String targetDate = destDf.format(date);
			System.out.println("Target Date :"+targetDate);

		} catch (ParseException ex) {
			ex.printStackTrace();
		}

	}

}

Output:


Source Date :2019-02-12T11:29:10.761Z
Target Date :02/43/2019 04:59:10 PM

More Issues Solution

To solved Date Time same code , formatting  and issues solutions follow the link given below:

Java Date and Time Handling Tutorial

 

[Solved] Date Format AM/PM : java.lang.IllegalArgumentException: Illegal pattern character ‘A’


SimpleDateFormat throw java.lang.IllegalArgumentException at runtime while parsing date format.

Follow link below to get in depth knowledge of IllegalArgumentException .

[Solved] java.lang.IllegalArgumentException: “ABC”

Example DateTime throwing IllegalArgumentexception

In this example target format is throwing IllegalArgumentException because of using invalid formatting char for display AM/PM.

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class ChangeDateFormat {

	public static void main(String[] args) {
		String targetFormat = "MM/DD/YYYY hh:mm:ss AM/PM";
		String currentFormat = "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'";
		String sourceDate = "2019-02-12T11:29:10.761Z";
		System.out.println("Source Date :"+sourceDate);
		String timezone = "CDT";
		DateFormat srcDf = new SimpleDateFormat(currentFormat);
		srcDf.setTimeZone(TimeZone.getTimeZone(timezone));
		DateFormat destDf = new SimpleDateFormat(targetFormat);
		try {
			Date date = srcDf.parse(sourceDate);
			String targetDate = destDf.format(date);
			System.out.println("Target Date :"+targetDate);

		} catch (ParseException ex) {
			ex.printStackTrace();
		}

	}

}

Output:


Source Date :2019-02-12T11:29:10.761Z
Exception in thread "main" java.lang.IllegalArgumentException: Illegal pattern character 'A'
    at java.text.SimpleDateFormat.compile(Unknown Source)
    at java.text.SimpleDateFormat.initialize(Unknown Source)
    at java.text.SimpleDateFormat.(Unknown Source)
    at java.text.SimpleDateFormat.(Unknown Source)
    at com.fiot.test.ChangeDateFormat.main(ChangeDateFormat.java:19)

Solutions :

SimpleDateFormat allow only some key characters only while using date time formatting. Here for showing AM/PM should use character as as mentioned in below code in targetFormat. Follow link to see complete list for formatting characters and date format.

Date Time Formatting Characters and Patterns

Correct format to AM/PM
"MM/DD/YYYY hh:mm:ss a"

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class ChangeDateFormat {

	public static void main(String[] args) {
		String targetFormat = "MM/DD/YYYY hh:mm:ss a";
		String currentFormat = "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'";
		String sourceDate = "2019-02-12T11:29:10.761Z";
		System.out.println("Source Date :"+sourceDate);
		String timezone = "CDT";
		DateFormat srcDf = new SimpleDateFormat(currentFormat);
		srcDf.setTimeZone(TimeZone.getTimeZone(timezone));
		DateFormat destDf = new SimpleDateFormat(targetFormat);
		try {
			Date date = srcDf.parse(sourceDate);
			String targetDate = destDf.format(date);
			System.out.println("Target Date :"+targetDate);

		} catch (ParseException ex) {
			ex.printStackTrace();
		}

	}

}

Output:


Source Date :2019-02-12T11:29:10.761Z
Target Date :02/43/2019 04:59:10 PM

More Issues Solution

To solved Date Time same code , formatting  and issues solutions follow the link given below:

Java Date and Time Handling Tutorial

Java : How to convert seconds to Time?


In this blog, you will learn to convert seconds to time. An hour has 60*60=3600 seconds and a minute has 60 seconds.

Example
In this example helps you to convert total seconds to time as (hour, minute an d second). To show as text String convert these these values to String.

public class ConvertSecondToTime {

public static void main(String[] args) {
 long time = 180500700;
 ConvertSecondToTime ts = new ConvertSecondToTime();
 System.out.println("Inserted Total Seconds :"+time);
 System.out.println(ts.secondsToTimeString(time));
}

public static String secondsToTimeString(long time) {
 int seconds = (int) (time % 60);
 int minutes = (int) ((time / 60) % 60);
 int hours = (int) ((time / 3600) % 24);
 String secondsTxt = (seconds < 10 ? "0" : "") + seconds;
 String minutesTxt = (minutes < 10 ? "0" : "") + minutes;
 String hoursTxt = (hours < 10 ? "0" : "") + hours;
 return new String("Converted Time :"+ hoursTxt + " Hour : " + minutesTxt + " Minute :" + secondsTxt + " Second");
 }
}

Output


Inserted Total Seconds :180500700
Converted Time :03 Hour : 05 Minute :00 Second

[Solved] java.time.DateTimeException: Invalid value for NanoOfSecond (valid values 0 – 999999999): -1


java.time.DateTimeException occurs while calculating Date and Time in java.time classes. This exception is used to indicate problems with creating, querying and manipulating date-time objects.

Constructors

  • DateTimeException(String message) : Constructs a new date-time exception with the specified message.
  • DateTimeException(String message, Throwable cause) : Constructs a new date-time exception with the specified message and cause.

Sample Code

 try {
// Try creating time by providing invalid inputs
LocalTime invalidTime = LocalTime.of(12, 12, 23,-1);
// Exception in thread "main" java.time.DateTimeException:
// Invalid value for nano seconds valid values(0 - 999999999): -1
} catch (DateTimeException ex) {
ex.printStackTrace();
}
 

Output Message


Exception in thread "main" java.time.DateTimeException: Invalid value for NanoOfSecond (valid values 0 - 999999999): -1
    at java.time.temporal.ValueRange.checkValidValue(Unknown Source)
    at java.time.temporal.ChronoField.checkValidValue(Unknown Source)
    at java.time.LocalTime.of(Unknown Source)
    at datetime.Java8DateTime.main(Java8DateTime.java:69)

Issue

Here with throw DateTimeException if pass as Invalidate Date and Time. For above example passing hour as 24 which causing this issue because allowed values for hours is between range 0-23.

Solutions

To solve this issue pass hour value in method as between range 0-23. Below are some methods for LocalTime.of() and corresponding values range for each parameters.

  • LocalTime localTime= LocalTime.of(int hour, int minute) : Obtains an instance of LocalTime from an hour and minute.
  • LocalTime localTime= LocalTime.of(int hour, int minute, int second): Obtains an instance of LocalTime from an hour, minute and second.
  • LocalTime localTime= LocalTime.of(int hour, int minute, int second, int nanoOfSecond): Obtains an instance of LocalTime from an hour, minute, second and nanosecond.

Date and Time Allowed range:

  • Month : 0-12
  • Day : 

1-31 : (January, March, May, July, August, October, December)

1-28/29 : (February) Leap year have 29 days in February and Non leap year have 28 days

1-30: (April, June, September, November)

  • Hour: 0-23
  • Minute: 0-59
  • Second : 0 – 59
  • NanoSecond: 0 – 999999999

Issues Solution

For more other JAVA/JDBC issues solution follow link JAVA/JDBC Issues.