4

I converted an Instant to LocalDateTime in Java with Spring Boot as seen below

LocalDateTime.ofInstant(timeInUtc, zoneId);

In my test I got a Regex to check whether my resource returns a Json with a LocalDateTime. The Regex expects a JSON value in the format:

 2018-11-15T08:38:49.382

But it looks like the trailing zero is removed, meaning instead of

2018-11-15T08:38:49.380

which would comply to the regex, I get

 2018-11-15T08:38:49.38

How can I make sure that the trailing zero is not removed?

Mark Rotteveel
  • 100,966
  • 191
  • 140
  • 197
Tror1935
  • 83
  • 1
  • 5
  • 2
    How are you converting your localdatetime object to string? – ernest_k Nov 15 '18 at 07:46
  • How do you print/format it? If I run `System.out.println(LocalDateTime.parse("2018-11-15T08:38:49.380"))` I get `2018-11-15T08:38:49.380` (trailing zero's there). – Tomasz Linkowski Nov 15 '18 at 07:47
  • I use Jackson to serialize and deserialize my object to JSON. – Tror1935 Nov 15 '18 at 07:54
  • For the sake of precision, the trailing zero is not being removed. Neither `Instant` nor `LocalDateTime` have any textual representation in them, but generate one when you call `toString`. And doesn’t generate trailing zeroes in this case. They do generate ISO 8601 format, which for most purposes is fine, so please check once more whether the absence of zeroes is really a problem in your situation. – Ole V.V. Nov 15 '18 at 08:30
  • 1
    Why don’t you fix the regex instead? – Holger Nov 15 '18 at 10:32
  • Or even better, @Holger, don’t use a regular expression for date-time validation, Instead parse and see if it succeeds. Use for example the 1-arg `LocalDateTime.parse`. – Ole V.V. Nov 15 '18 at 12:23
  • I fixed the regex, I hoped there would be an easy fix where I don't have to change the regex. Thanks you all! – Tror1935 Nov 15 '18 at 14:41
  • I wonder if either of you, @Holger and Tror1935, would post that as an answer? I believe it would be helpful. – Ole V.V. Nov 16 '18 at 10:46
  • @OleV.V. well, I don’t know the original regex and “fix the regex” is a bit thin for an answer. – Holger Nov 16 '18 at 12:06

1 Answers1

7

Formatting the date would help to retain the trailing zero

DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS")

Output looks like below:

2018-11-15T08:03:45.580

The code below:

public class Post2 {

    public static void main(String[] args) {

        String date = LocalDateTime.ofInstant(Instant.now(), ZoneId.of("UTC"))
           .format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS"));
        System.out.println(date);

    }
}

EDIT Adding regex matching to match date time with and without milli seconds.

        String regex = "^\\d\\d\\d\\d-(0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[01]) (00|[0-9]|1[0-9]|2[0-3]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])(\\.{0,1}[0-9]{1,3})$";

        String str1 = "2015-1-11 13:57:24";

        String str2 = "2015-1-11 13:57:24.0";
        String str3 = "2015-1-11 13:57:24.00";
        String str4 = "2015-1-11 13:57:24.000";
        String str5 = "2015-1-11 13:57:24.1";
        String str6 = "2015-1-11 13:57:24.12";
        String str7 = "2015-1-11 13:57:24.1222";
        String str8 = "2015-1-11 13:57:24.02";

        System.out.println( str1.matches(regex));
        System.out.println(str2.matches(regex));
        System.out.println(str3.matches(regex));
        System.out.println(str4.matches(regex));
        System.out.println(str5.matches(regex));
        System.out.println(str6.matches(regex));
        System.out.println(str7.matches(regex));
        System.out.println(str8.matches(regex));

output:

true
true
true
true
true
true
false
true
Shiva
  • 1,962
  • 2
  • 13
  • 31