From defdb44e2c25914a0e1e80b5acc0147c7ba52e99 Mon Sep 17 00:00:00 2001 From: Daan Schutte Date: Sun, 1 Feb 2026 17:28:09 +0300 Subject: [PATCH 1/3] Handle implicit DateTime-DateTimeOffset conversions Signed-off-by: Daan Schutte --- src/Dapr.Workflow/WorkflowState.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Dapr.Workflow/WorkflowState.cs b/src/Dapr.Workflow/WorkflowState.cs index 15dcce08c..cd69b0966 100644 --- a/src/Dapr.Workflow/WorkflowState.cs +++ b/src/Dapr.Workflow/WorkflowState.cs @@ -31,7 +31,7 @@ internal WorkflowState(WorkflowMetadata? metadata) { _metadata = metadata; } - + /// /// Gets a value indicating whether the requested workflow instance exists. /// @@ -52,13 +52,19 @@ WorkflowRuntimeStatus.Failed or /// /// Gets the time at which this workflow instance was created. + /// Treat workflow metadata timestamps as UTC to avoid local-time conversions if null. /// - public DateTimeOffset CreatedAt => _metadata?.CreatedAt ?? default; + public DateTimeOffset CreatedAt => _metadata?.CreatedAt is { } dt && dt != default + ? new DateTimeOffset(DateTime.SpecifyKind(dt, DateTimeKind.Utc)) + : default; /// /// Gets the time at which this workflow instance last had its state updated. + /// Treat workflow metadata timestamps as UTC to avoid local-time conversions if null. /// - public DateTimeOffset LastUpdatedAt => _metadata?.LastUpdatedAt ?? default; + public DateTimeOffset LastUpdatedAt => _metadata?.LastUpdatedAt is { } dt && dt != default + ? new DateTimeOffset(DateTime.SpecifyKind(dt, DateTimeKind.Utc)) + : default; /// /// Gets the execution status of the workflow. From 303b6baeec3786d3c0aec32251d7f358492e684f Mon Sep 17 00:00:00 2001 From: Daan Schutte Date: Sun, 1 Feb 2026 18:02:37 +0300 Subject: [PATCH 2/3] Update tests Signed-off-by: Daan Schutte --- test/Dapr.Workflow.Test/WorkflowStateTests.cs | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/test/Dapr.Workflow.Test/WorkflowStateTests.cs b/test/Dapr.Workflow.Test/WorkflowStateTests.cs index 5fc99930c..9f94cef14 100644 --- a/test/Dapr.Workflow.Test/WorkflowStateTests.cs +++ b/test/Dapr.Workflow.Test/WorkflowStateTests.cs @@ -56,11 +56,29 @@ public void Properties_ShouldReflectMetadata_WhenPresent() Assert.True(state.Exists); Assert.True(state.IsWorkflowRunning); Assert.False(state.IsWorkflowCompleted); - Assert.Equal(created, state.CreatedAt); - Assert.Equal(updated, state.LastUpdatedAt); + Assert.Equal(created, state.CreatedAt.DateTime); + Assert.Equal(updated, state.LastUpdatedAt.DateTime); Assert.Equal(WorkflowRuntimeStatus.Running, state.RuntimeStatus); } + [Fact] + public void CreatedAt_ShouldReturnDefault_WhenMetadataCreatedAtIsMinValue() + { + var serializer = new JsonWorkflowSerializer(); + var metadata = new WorkflowMetadata( + InstanceId: "i", + Name: "wf", + RuntimeStatus: WorkflowRuntimeStatus.Running, + CreatedAt: DateTime.MinValue, + LastUpdatedAt: DateTime.MinValue, + Serializer: serializer); + + var state = new WorkflowState(metadata); + + Assert.Equal(DateTime.MinValue, state.CreatedAt.DateTime); + Assert.Equal(DateTime.MinValue, state.LastUpdatedAt.DateTime); + } + [Theory] [InlineData(WorkflowRuntimeStatus.Completed)] [InlineData(WorkflowRuntimeStatus.Failed)] From 59879a40a8d464a9f2a1dc315f07bd6bf1704d95 Mon Sep 17 00:00:00 2001 From: Daan Schutte Date: Mon, 2 Feb 2026 15:40:27 +0300 Subject: [PATCH 3/3] Drop outdated comments Signed-off-by: Daan Schutte --- src/Dapr.Workflow/WorkflowState.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Dapr.Workflow/WorkflowState.cs b/src/Dapr.Workflow/WorkflowState.cs index cd69b0966..3082cd8a6 100644 --- a/src/Dapr.Workflow/WorkflowState.cs +++ b/src/Dapr.Workflow/WorkflowState.cs @@ -52,7 +52,6 @@ WorkflowRuntimeStatus.Failed or /// /// Gets the time at which this workflow instance was created. - /// Treat workflow metadata timestamps as UTC to avoid local-time conversions if null. /// public DateTimeOffset CreatedAt => _metadata?.CreatedAt is { } dt && dt != default ? new DateTimeOffset(DateTime.SpecifyKind(dt, DateTimeKind.Utc)) @@ -60,7 +59,6 @@ WorkflowRuntimeStatus.Failed or /// /// Gets the time at which this workflow instance last had its state updated. - /// Treat workflow metadata timestamps as UTC to avoid local-time conversions if null. /// public DateTimeOffset LastUpdatedAt => _metadata?.LastUpdatedAt is { } dt && dt != default ? new DateTimeOffset(DateTime.SpecifyKind(dt, DateTimeKind.Utc))