Q:

How to parse input string in standard ISO 8601 format in UTC to Java?

The following java code throws an exception 
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

simpleDateFormat.parse("2019-09-10T07:06:26.287Z") 

java.text.ParseException: Unparseable date: "2019-09-10T07:06:26.287Z"
    at java.text.DateFormat.parse(DateFormat.java:366)

any idea how can i fix this issue

A:

tl;dr
Instant.parse( "2019-09-10T07:06:26.287Z" ) 

java.time
The modern solution uses java.time classes built into Java 8 and later, with a back-port for Java 6 & 7.
You are using their terrible predecessor classes, bundled with the earliest versions of Java. The SimpleDateFormat class and its siblings are flawed,  developed by people who did not understand date-time handling. Avoid these classes entirely.
ISO 8601
Your input string represents a moment in UTC using standard ISO 8601 format. The Z on the end is short for UTC, and is pronounced “Zulu”.
The java.time classes use the standard ISO 8601 formats by default when parsing/generating strings. So no need to specify a formatting pattern.
For a moment in UTC, use the class Instant.
Instant instant = Instant.parse( "2019-09-10T07:06:26.287Z" ) ;

To see this same moment through the wall-clock time used by the people of a particular region, apply a ZoneId (time zone) to get a ZonedDateTime object.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

See this code run live at IdeOne.com.

instant.toString(): 2019-09-10T07:06:26.287Z
zdt.toString(): 2019-09-10T03:06:26.287-04:00[America/Montreal]

Same moment, same simultaneous point on the timeline, different wall-clock time.

