Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion src/FSharp.Data.Runtime.Utilities/TextRuntime.fs
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,16 @@ type TextRuntime =
|> Option.bind (TextConversions.AsDateTime(TextRuntime.GetCulture cultureStr))

static member ConvertDateTimeOffset(cultureStr, text) =
let culture = TextRuntime.GetCulture cultureStr

text
|> Option.bind (TextConversions.AsDateTimeOffset(TextRuntime.GetCulture cultureStr))
|> Option.bind (fun s ->
match TextConversions.AsDateTimeOffset culture s with
| Some dto -> Some dto
| None ->
// Fall back for xs:dateTime values without timezone (DateTimeKind.Unspecified).
// AsDateTime converts Unspecified to Local, so DateTimeOffset(dt) uses the local offset.
TextConversions.AsDateTime culture s |> Option.map DateTimeOffset)

static member ConvertTimeSpan(cultureStr, text) =
text
Expand Down
8 changes: 8 additions & 0 deletions tests/FSharp.Data.Tests/XmlProvider.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1213,6 +1213,14 @@ let ``date is formatted properly``() =
validXml.XElement.Attribute(XName.Get "date").Value
|> should equal "2018-08-29"

[<Test>]
let ``xs:dateTime without timezone parses as DateTimeOffset (issue 1437)``() =
// xs:dateTime values without timezone offset (DateTimeKind.Unspecified) should
// still parse successfully as DateTimeOffset, treated as local time.
let xml = """<A int="0" long="0" date="2022-01-01" dateTime="2022-04-28T10:09:17" boolean="false" decimal="0" double="0" />"""
let a = SimpleTypes.Parse(xml)
a.DateTime.DateTime |> should equal (System.DateTime(2022, 4, 28, 10, 9, 17))

type TimeSpanXML = XmlProvider<"Data/TimeSpans.xml">

[<Test>]
Expand Down
Loading