Tag Archives: java.util.date

Solved] com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.util.Date` from String “MM/dd/yyyy”: not a valid representation for date format


InvalidFormatException is subclass of MismatchedInputException. InvalidFormatException occurred because of bad formatting or format not match with the prespecified format of value to deserialize.

InvalidFormatException Example

This example throwing InvalidFormatException because JSONis having the format “MM/dd/yyyy” for dob which is not compatible with standard date format for deserializations. Below is a standard format for a date as JACKSON support:

  • yyyy-MM-dd’T’HH:mm:ss.SSSZ
  • yyyy-MM-dd’T’HH:mm:ss.SSS
  • EEE, dd MMM yyyy HH:mm:ss zzz
  • yyyy-MM-dd
import java.util.Date;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
import com.fasterxml.jackson.annotation.JsonFormat;

public class StudentDetail {
	private int rollNumber;
	private String firstName;
	private String lastName;
	private Date dob;
	//getter and setter of class
	}
import java.io.IOException;

import com.fasterxml.jackson.databind.ObjectMapper;

public class TestJacksonExample2 {

	public static void main(String[] args) {

	    String json="{\"rollNumber\":21 , \"firstName\":\"Saurabh\" , \"lastName\":\"Gupta\",  \"dob\":\"12/13/1985\"}";

	    System.out.println(json);
		try
		{
	    ObjectMapper mapper = new ObjectMapper();
	    StudentDetail student= mapper.readValue(json, StudentDetail.class);
	    System.out.println(student);
		}
		catch(IOException ex)
		{
			ex.printStackTrace();
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}

	}

}

InvalidFormatException Stacktrace


com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.util.Date` from String "12/13/1985": not a valid representation (error: Failed to parse Date value '12/13/1985': Cannot parse date "12/13/1985": not compatible with any of standard forms ("yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd"))
 at [Source: (String)"{"rollNumber":21 , "firstName":"Saurabh" , "lastName":"Gupta",  "dob":"12/13/1985"}"; line: 1, column: 71] (through reference chain: com.fiot.json.jackson.exceptions.StudentDetail["dob"])
    at com.fasterxml.jackson.databind.exc.InvalidFormatException.from(InvalidFormatException.java:67)
    at com.fasterxml.jackson.databind.DeserializationContext.weirdStringException(DeserializationContext.java:1549)
    at com.fasterxml.jackson.databind.DeserializationContext.handleWeirdStringValue(DeserializationContext.java:911)
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:524)
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:467)
    at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateBasedDeserializer._parseDate(DateDeserializers.java:195)
    at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:285)
    at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:268)
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013)

Solutions

  1. Pass date format for JSON as the standard one for deserializations.
    • yyyy-MM-dd’T’HH:mm:ss.SSSZ
    • yyyy-MM-dd’T’HH:mm:ss.SSS
    • EEE, dd MMM yyyy HH:mm:ss zzz
    • yyyy-MM-dd
  2. Use annotation @JsonFormat as below to support some other new date format.
    public class StudentDetail {
    	private int rollNumber;
    	private String firstName;
    	private String lastName;
    	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "MM/dd/yyyy")
    	private Date dob;
    	//getter and setter of class
    	}
    

Preferences

https://fasterxml.github.io/jackson-databind/javadoc/2.9/com/fasterxml/jackson/databind/exc/InvalidFormatException.html

You would like to see

Follow below link to learn more on JSON and  JSON issues solutions:

Advertisements

Java : How to get current date time?


In below example you will learn ways to get current date and time from Legacy Java Date and Calendar APIs and also from Java 8 LocalDateTime, LocalDate and LocalTime..

java.util.Date

Date date=new Date();

java.util.Calendar and java.util.GregorianCalendar

Calendar calendar=Calendar.getInstance();
Calendar gCalnedar=GregorianCalendar.getInstance();

java.time.LocaleDateTime

LocalDateTime localDateTime=LocalDateTime.now();

java.time.LocaleDate

LocalDate localDate=LocalDate.now();

java.time.LocaleTime

LocalTime localTime=LocalTime.now();

 

Complete Example

package com.date;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class CurrentDateandTimeExample {

public static void main(String[] args) {

SimpleDateFormat dateTimeFormat=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
//java.util.Date
Date date=new Date();
System.out.println("java.util.date Current Date and Time :"+ dateTimeFormat.format(date));

//java.util.Calendar and java.util.GregorianCalendar
Calendar calendar=Calendar.getInstance();
System.out.println("java.util.Calendar Current Date and Time :"+ dateTimeFormat.format(calendar.getTime()));
Calendar gCalendar=GregorianCalendar.getInstance();
System.out.println("java.util.GregorianCalendar Current Date and Time :"+ dateTimeFormat.format(gCalendar.getTime()));

//Java 8
//java.time.LocalDateTime
DateTimeFormatter dateTimeFormatter=DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
LocalDateTime lDateTime=LocalDateTime.now();
System.out.println("java.time.LocalDateTime Current Date and Time :"+ dateTimeFormatter.format(lDateTime));

//java.time.LocalDate
DateTimeFormatter dateFormatter=DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate lDate=LocalDate.now();
System.out.println("java.time.LocalDate Current :"+ dateFormatter.format(lDate));

//java.time.LocalTime
DateTimeFormatter timeFormatter=DateTimeFormatter.ofPattern("HH:mm:ss");
LocalTime lTime=LocalTime.now();
System.out.println("java.time.LocalTime Current Time :"+ timeFormatter.format(lTime));

	}

}

Output


java.util.date Current Date and Time :2018/08/03 12:12:26
java.util.Calendar Current Date and Time :2018/08/03 12:12:26
java.util.GregorianCalendar Current Date and Time :2018/08/03 12:12:26
java.time.LocalDateTime Current Date and Time :2018/08/03 12:12:26
java.time.LocalDate Current :2018/08/03
java.time.LocalTime Current Time :12:12:26

Java : java.util.Date and java.sql.Timestamp Conversion


java.sql.Timestamp is subclass of java.util.Date. java.sql.Timestamp  allows the JDBC API to identify this as an SQL TIMESTAMP value. It hold the SQL TIMESTAMP fractional seconds value, by allowing the specification of fractional seconds to a precision of nanoseconds. A Timestamp also provides formatting and parsing operations to support the JDBC escape syntax for timestamp values.
The precision of a Timestamp object is calculated to be either:
Precision 19 :yyyy-mm-dd hh:mm:ss
Precision 20 + s: yyyy-mm-dd hh:mm:ss.[fff…] and s represents the scale of the given Timestamp, its fractional seconds precision.

Note: This type is a composite of a java.util.Date and a separate nanoseconds value. Only integral seconds are stored in the java.util.Date component. The fractional seconds – the nanos – are separate.

Example

package com.date;

import java.sql.Timestamp;
import java.util.Date;

public class DateSQLTimestampConversion {

public static void main(String[] args) {
Date date = new Date();
System.out.println("Java Util Date : " + date);

// Converting java.util.Date to java.sql.Timestamp
Timestamp timestamp = new Timestamp(date.getTime());
System.out.println("Java SQL Timestamp : " + timestamp);

// Convert java.sql.Timestamp to java.util.Date
Date newDate = new Date(timestamp.getTime());
System.out.println("Java Util Date : " + date);
}

}

Output


Java Util Date : Mon Jul 30 11:35:27 PDT 2018
Java SQL Timestamp : 2018-07-30 11:35:27.246
Java Util Date : Mon Jul 30 11:35:27 PDT 2018

Reference

https://docs.oracle.com/javase/8/docs/api/java/sql/Timestamp.html

Java : java.util.Date and java.sql.Date Conversion


java.sql.Date a thin wrapper around a millisecond value that allows JDBC to identify this as an SQL DATE around. A milliseconds value represents the number of milliseconds that have passed since January 1, 1970 00:00:00.000 GMT (epoch). java.sql.Date instance normalized by settings hours, minute, seconds and milliseconds to zero.

Note: java.sql.Date have only Date part no any time related values.

Example

package com.date;

import java.util.Date;

public class DateSQLConversion {

public static void main(String[] args) {
java.util.Date utilDate = new java.util.Date();
System.out.println("Java Util Date : " + utilDate);

// contains only date information without time
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
System.out.println("Java SQL Date : " + sqlDate); 

//convert sql date to java date
java.util.Date newUtilDate=new Date(sqlDate.getTime());
System.out.println("Java Util Date : " + newUtilDate);
}

}

Output


Java Util Date : Mon Jul 30 11:06:20 PDT 2018
Java SQL Date : 2018-07-30
Java Util Date : Mon Jul 30 11:06:20 PDT 2018

Java : Date Format Conversion


In below example for Date format conversion. Here are characters use for date format design.

[table id=6 /]

 Example

package com.date;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateFormatChange {

public static String LEGACY_FORMAT = "EEE MMM dd hh:mm:ss zzz yyyy";
public static String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS zzz";
public static String SHORT_DATE = "yyyy-MM-dd";
private static final String MAIN_DATE_FORMAT = "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'";
private static final String DATE_FORMAT1 = "yyyyMMdd";
private static final String DATE_FORMAT2 = "yyyy/MM/dd";

private static final SimpleDateFormat legacyFormatter = new SimpleDateFormat(LEGACY_FORMAT);
private static final SimpleDateFormat isoFormatter = new SimpleDateFormat(ISO_FORMAT);
private static final SimpleDateFormat shortFormatter = new SimpleDateFormat(SHORT_DATE);

public static void main(String[] args) {
Date date = new Date();
System.out.println("Default Date Format:" + date);
System.out.println("Legacy Date Format:" + legacyFormatter.format(date));
System.out.println("ISO Date Format:" + isoFormatter.format(date));
System.out.println("Short Date Format:" + shortFormatter.format(date));
// Other Date Format
SimpleDateFormat formatter = new SimpleDateFormat(DATE_FORMAT1);
System.out.println("Short Date Format1:" + formatter.format(date));
formatter = new SimpleDateFormat(DATE_FORMAT2);
System.out.println("Short Date Format2:" + formatter.format(date));
formatter = new SimpleDateFormat(MAIN_DATE_FORMAT);
System.out.println("Main Date Format:" + formatter.format(date));
	}
}

Output


Default Date Format:Sat Jul 28 13:35:28 PDT 2018
Legacy Date Format:Sat Jul 28 01:35:28 PDT 2018
ISO Date Format:2018-07-28T13:35:28.245 PDT
Short Date Format:2018-07-28
Short Date Format1:20180728
Short Date Format2:2018/07/28
Main Date Format:2018-07-28T01:35:28.245Z

Date pattern Examples

[table id=7 /]