user3311644
user3311644

Reputation: 59

Simpledateformat is not parsing milliseconds

String dateTimePattern = "yyyy-MM-dd HH:mm:ss.SSS";
SimpleDateFormat sdf = new SimpleDateFormat(dateTimePattern);
Date startTime = sdf.parse("2014-03-14 04:16:58.666");
System.out.println(startTime);

Output

Fri Mar 14 04:16:58 CDT 2014

Why is not printing milliseconds?

Upvotes: 1

Views: 813

Answers (3)

Basil Bourque
Basil Bourque

Reputation: 338624

The other answers are correct.

Avoid j.u.Date

You would have simpler code and none of that confusion if you used Joda-Time (or java.time package in Java 8) rather than the notoriously troublesome java.util.Date & .Calendar & java.text.SimpleDateFormat classes bundled with Java.

Joda-Time

Joda-Time has built-in automatic parsers for ISO 8601 formats. Your format would work if you replaced that space with a T.

Example code using Joda-Time 2.3…

String inputRaw = ( "2014-03-14 04:16:58.666" );
String input = inputRaw.replace( " ", "T" );

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime dateTime = new DateTime( input, timeZone );

DateTime dateTimeUtc = dateTime.withZone( DateTimeZone.UTC );

Dump to console…

System.out.println( "input: " + input );
System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTimeUtc: " + dateTimeUtc );

When run…

input: 2014-03-14T04:16:58.666
dateTime: 2014-03-14T04:16:58.666+01:00
dateTimeUtc: 2014-03-14T03:16:58.666Z

Upvotes: 1

Keppil
Keppil

Reputation: 46219

The problem here is not that the milliseconds are not getting parsed, your startTime includes the milliseconds you have provided. The problem is that they are not getting printed.

You need to format your output if you want something other than the default format from Date#toString():

Converts this Date object to a String of the form: dow mon dd hh:mm:ss zzz yyyy

You can use your SimpleDateFormat to format your output too, which will give you milliseconds:

System.out.println(sdf.format(startTime));

Upvotes: 3

Elliott Frisch
Elliott Frisch

Reputation: 201447

You are printing startTime directly (e.g. the toString() from java.util.Date); if you want your output to match your specified DateFormat you could do -

 String dateTimePattern = "yyyy-MM-dd HH:mm:ss.SSS";
 SimpleDateFormat sdf = new SimpleDateFormat(dateTimePattern);
 Date startTime = sdf.parse("2014-03-14 04:16:58.666");
 System.out.println(sdf.format(startTime)); // <-- use the DateFormat.

Which will output

2014-03-14 04:16:58.666

Upvotes: 3

Related Questions