Skip to content

DateTimeParseException: Unable to parse timestamp with timezone and microseconds in getJob test #1447

@humblefool25

Description

@humblefool25
Image

Description

Running mvn clean install with Java 11 fails during the following test:

DaprPreviewClientGrpcTest.getJobShouldReturnResponseWithDueTimeSetWhenResponseHasDueTime

The error is due to parsing an ISO-8601 datetime string with microseconds and a timezone offset.


Steps to Reproduce

  1. Set Java version:

    export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
    java -version
    

    Output:

    openjdk version "11.0.27" 2025-04-15
    
  2. Run:

    mvn clean install
    
  3. Observe the test failure.


Error Log


-------------------------------------------------------------------------------
Test set: io.dapr.client.DaprPreviewClientGrpcTest
-------------------------------------------------------------------------------
Tests run: 39, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.393 s <<< FAILURE! -- in io.dapr.client.DaprPreviewClientGrpcTest
io.dapr.client.DaprPreviewClientGrpcTest.getJobShouldReturnResponseWithDueTimeSetWhenResponseHasDueTime -- Time elapsed: 0.009 s <<< ERROR!
java.time.format.DateTimeParseException: Text '2025-07-12T21:30:10.720884+05:30' could not be parsed at index 26
	at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
	at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
	at java.base/java.time.Instant.parse(Instant.java:395)
	at io.dapr.client.DaprClientImpl.lambda$getJob$57(DaprClientImpl.java:1378)
	at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:106)
	at reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:172)
	at io.dapr.client.DaprClientImpl$1.onNext(DaprClientImpl.java:1508)
	at io.dapr.client.DaprPreviewClientGrpcTest.lambda$getJobShouldReturnResponseWithDueTimeSetWhenResponseHasDueTime$46(DaprPreviewClientGrpcTest.java:899)
	at org.mockito.internal.stubbing.StubbedInvocationMatcher.answer(StubbedInvocationMatcher.java:42)
	at org.mockito.internal.handler.MockHandlerImpl.handle(MockHandlerImpl.java:103)
	at org.mockito.internal.handler.NullResultGuardian.handle(NullResultGuardian.java:29)
	at org.mockito.internal.handler.InvocationNotifierHandler.handle(InvocationNotifierHandler.java:34)
	at org.mockito.internal.creation.bytebuddy.MockMethodInterceptor.doIntercept(MockMethodInterceptor.java:82)
	at org.mockito.internal.creation.bytebuddy.MockMethodAdvice.handle(MockMethodAdvice.java:151)
	at io.dapr.v1.DaprGrpc$DaprStub.getJobAlpha1(DaprGrpc.java:3166)
	at io.dapr.client.DaprClientImpl.lambda$getJob$55(DaprClientImpl.java:1363)
	at io.dapr.client.DaprClientImpl.lambda$createMono$60(DaprClientImpl.java:1491)
	at io.dapr.exceptions.DaprException.lambda$wrap$1(DaprException.java:277)
	at io.dapr.client.DaprClientImpl.lambda$createMono$61(DaprClientImpl.java:1492)
	at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:58)
	at reactor.core.publisher.MonoDeferContextual.subscribe(MonoDeferContextual.java:55)
	at reactor.core.publisher.Mono.subscribe(Mono.java:4444)
	at reactor.core.publisher.Mono.block(Mono.java:1709)
	at io.dapr.client.DaprPreviewClientGrpcTest.getJobShouldReturnResponseWithDueTimeSetWhenResponseHasDueTime(DaprPreviewClientGrpcTest.java:908)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	Suppressed: java.lang.Exception: #block terminated with an error
		at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:99)
		at reactor.core.publisher.Mono.block(Mono.java:1710)
		... 4 more


Environment

Setting Value
Java Version OpenJDK 11.0.27 (Ubuntu)
Maven Version mvn --version (latest)
Dapr SDK Version 1.16.0-SNAPSHOT
OS Ubuntu 22.04
Command mvn clean install

Root Cause

The timestamp string:

2025-07-12T21:30:10.720884+05:30

contains both microseconds and a timezone offset, which Instant.parse() does not support.
Instant.parse() expects the datetime in UTC format like:

2025-07-12T21:30:10.720884Z

Suggested Fix

Replace:

Instant.parse(dateString);

With:

OffsetDateTime.parse(dateString, DateTimeFormatter.ISO_OFFSET_DATE_TIME).toInstant();

This change will correctly parse the datetime string with offset and microseconds.


Metadata

Metadata

Assignees

No one assigned

    Labels

    kind/bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions