Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[JavaScript] Makes a pass on the implementation of DateTime.ToString #3692

Closed
MangelMaxime opened this issue Jan 6, 2024 · 7 comments
Closed

Comments

@MangelMaxime
Copy link
Member

The current implementation of DateTime.ToString is incorrect for the javascript target.

For example, it considers T and t format to be the same thing when it isn't in .NET.

Description

[<Fact>]
let ``test DateTime.ToString("d") works`` () =
    DateTime(2014, 9, 11, 16, 37, 11, 345).ToString("d")
    |> equal "9/11/2014"

[<Fact>]
let ``test DateTime.ToString("T") works`` () =
    DateTime(2014, 9, 11, 3, 37, 11, 345).ToString("T")
    |> equal "3:37:11 AM"

    DateTime(2014, 9, 11, 16, 37, 11, 345).ToString("T")
    |> equal "4:37:11 PM"

[<Fact>]
let ``test DateTime.ToString("t") works`` () =
    DateTime(2014, 9, 11, 3, 37, 11, 345).ToString("t")
    |> equal "3:37 AM"

    DateTime(2014, 9, 11, 16, 37, 11, 345).ToString("t")
    |> equal "4:37 PM"

Related information

  • Fable version: 4.9.0
  • Operating system
@MangelMaxime
Copy link
Member Author

Python implementation of DateTime.toString can serve as base for this improvements:

def to_string(date: datetime, format: str | None = None, provider: Any | None = None) -> str:
if date.tzinfo:
return date_to_string_with_offset(date, format)
return date_to_string_with_kind(date, format)

Test suite to pass can be found here (make sure to check with current main version for an up to date list)

[<Fact>]
let ``test DateTime.ToString with custom format works`` () =
DateTime(2014, 7, 1, 16, 37, 1, 2, 3).ToString("r d", CultureInfo.InvariantCulture)
|> equal "r 1"
DateTime(2014, 7, 13, 16, 37, 1, 2, 3).ToString("r d", CultureInfo.InvariantCulture)
|> equal "r 13"
DateTime(2014, 7, 1, 16, 37, 0).ToString("r dd", CultureInfo.InvariantCulture)
|> equal "r 01"
DateTime(2014, 7, 21, 16, 37, 0).ToString("r dd", CultureInfo.InvariantCulture)
|> equal "r 21"
DateTime(2014, 7, 7, 16, 37, 0).ToString("r ddd", CultureInfo.InvariantCulture)
|> equal "r Mon"
DateTime(2014, 7, 8, 16, 37, 0).ToString("r ddd", CultureInfo.InvariantCulture)
|> equal "r Tue"
DateTime(2014, 7, 9, 16, 37, 0).ToString("r ddd", CultureInfo.InvariantCulture)
|> equal "r Wed"
DateTime(2014, 7, 10, 16, 37, 0).ToString("r ddd", CultureInfo.InvariantCulture)
|> equal "r Thu"
DateTime(2014, 7, 11, 16, 37, 0).ToString("r ddd", CultureInfo.InvariantCulture)
|> equal "r Fri"
DateTime(2014, 7, 12, 16, 37, 0).ToString("r ddd", CultureInfo.InvariantCulture)
|> equal "r Sat"
DateTime(2014, 7, 13, 16, 37, 0).ToString("r ddd", CultureInfo.InvariantCulture)
|> equal "r Sun"
DateTime(2014, 7, 7, 16, 37, 0).ToString("r dddd", CultureInfo.InvariantCulture)
|> equal "r Monday"
DateTime(2014, 7, 8, 16, 37, 0).ToString("r dddd", CultureInfo.InvariantCulture)
|> equal "r Tuesday"
DateTime(2014, 7, 9, 16, 37, 0).ToString("r dddd", CultureInfo.InvariantCulture)
|> equal "r Wednesday"
DateTime(2014, 7, 10, 16, 37, 0).ToString("r dddd", CultureInfo.InvariantCulture)
|> equal "r Thursday"
DateTime(2014, 7, 11, 16, 37, 0).ToString("r dddd", CultureInfo.InvariantCulture)
|> equal "r Friday"
DateTime(2014, 7, 12, 16, 37, 0).ToString("r dddd", CultureInfo.InvariantCulture)
|> equal "r Saturday"
DateTime(2014, 7, 13, 16, 37, 0).ToString("r dddd", CultureInfo.InvariantCulture)
|> equal "r Sunday"
DateTime.Parse("2009-06-15T13:45:30.6175425").ToString("r f", CultureInfo.InvariantCulture)
|> equal "r 6"
DateTime.Parse("2009-06-15T13:45:30.05").ToString("r f", CultureInfo.InvariantCulture)
|> equal "r 0"
DateTime.Parse("2009-06-15T13:45:30.6175425").ToString("r ff", CultureInfo.InvariantCulture)
|> equal "r 61"
DateTime.Parse("2009-06-15T13:45:30.0050000").ToString("r ff", CultureInfo.InvariantCulture)
|> equal "r 00"
DateTime.Parse("2009-06-15T13:45:30.6175425").ToString("r fff", CultureInfo.InvariantCulture)
|> equal "r 617"
DateTime.Parse("2009-06-15T13:45:30.0005000").ToString("r fff", CultureInfo.InvariantCulture)
|> equal "r 000"
DateTime.Parse("2009-06-15T13:45:30.6175425").ToString("r ffff", CultureInfo.InvariantCulture)
|> equal "r 6175"
DateTime.Parse("2009-06-15T13:45:30.0000500").ToString("r ffff", CultureInfo.InvariantCulture)
|> equal "r 0000"
DateTime.Parse("2009-06-15T13:45:30.6175425").ToString("r fffff", CultureInfo.InvariantCulture)
|> equal "r 61754"
DateTime.Parse("2009-06-15T13:45:30.0000050").ToString("r fffff", CultureInfo.InvariantCulture)
|> equal "r 00000"
DateTime.Parse("2009-06-15T13:45:30.6175425").ToString("r ffffff", CultureInfo.InvariantCulture)
|> equal "r 617542"
DateTime.Parse("2009-06-15T13:45:30.0000005").ToString("r ffffff", CultureInfo.InvariantCulture)
|> equal "r 000000"
// We only have a precision up to the microsecond
// DateTime.Parse("2009-06-15T13:45:30.6175425").ToString("r fffffff", CultureInfo.InvariantCulture)
// |> equal "r 6175425"
DateTime.Parse("2009-06-15T13:45:30.6175425").ToString("r F", CultureInfo.InvariantCulture)
|> equal "r 6"
DateTime.Parse("2009-06-15T13:45:30.05").ToString("r F", CultureInfo.InvariantCulture)
|> equal "r "
DateTime.Parse("2009-06-15T13:45:30.6175425").ToString("r FF", CultureInfo.InvariantCulture)
|> equal "r 61"
DateTime.Parse("2009-06-15T13:45:30.0050000").ToString("r FF", CultureInfo.InvariantCulture)
|> equal "r "
DateTime.Parse("2009-06-15T13:45:30.6175425").ToString("r FFF", CultureInfo.InvariantCulture)
|> equal "r 617"
DateTime.Parse("2009-06-15T13:45:30.0005000").ToString("r FFF", CultureInfo.InvariantCulture)
|> equal "r "
DateTime.Parse("2009-06-15T13:45:30.6175425").ToString("r FFFF", CultureInfo.InvariantCulture)
|> equal "r 6175"
DateTime.Parse("2009-06-15T13:45:30.0000500").ToString("r FFFF", CultureInfo.InvariantCulture)
|> equal "r "
DateTime.Parse("2009-06-15T13:45:30.6175425").ToString("r FFFFF", CultureInfo.InvariantCulture)
|> equal "r 61754"
DateTime.Parse("2009-06-15T13:45:30.0000050").ToString("r FFFFF", CultureInfo.InvariantCulture)
|> equal "r "
DateTime.Parse("2009-06-15T13:45:30.0617425").ToString("r FFFFFF", CultureInfo.InvariantCulture)
|> equal "r 061742"
DateTime.Parse("2009-06-15T13:45:30.0000005").ToString("r FFFFFF", CultureInfo.InvariantCulture)
|> equal "r "
// We only have a precision up to the microsecond
// DateTime.Parse("2009-06-15T13:45:30.6175425").ToString("r FFFFFFF", CultureInfo.InvariantCulture)
// |> equal "r 6175425"
DateTime(2014, 7, 1, 16, 37, 0).ToString("r g", CultureInfo.InvariantCulture)
|> equal "r A.D."
DateTime(2014, 7, 1, 16, 37, 0).ToString("r gg", CultureInfo.InvariantCulture)
|> equal "r A.D."
DateTime(2014, 7, 1, 16, 37, 0).ToString("r h", CultureInfo.InvariantCulture)
|> equal "r 4"
DateTime(2014, 7, 1, 4, 37, 0).ToString("r h", CultureInfo.InvariantCulture)
|> equal "r 4"
DateTime(2014, 7, 1, 16, 37, 0).ToString("r hh", CultureInfo.InvariantCulture)
|> equal "r 04"
DateTime(2014, 7, 1, 4, 37, 0).ToString("r hh", CultureInfo.InvariantCulture)
|> equal "r 04"
DateTime(2014, 7, 1, 4, 37, 0).ToString("r H", CultureInfo.InvariantCulture)
|> equal "r 4"
DateTime(2014, 7, 1, 16, 37, 0).ToString("r H", CultureInfo.InvariantCulture)
|> equal "r 16"
DateTime(2014, 7, 1, 4, 37, 0).ToString("r HH", CultureInfo.InvariantCulture)
|> equal "r 04"
DateTime(2014, 7, 1, 16, 37, 0).ToString("r HH", CultureInfo.InvariantCulture)
|> equal "r 16"
DateTime(2014, 7, 1, 16, 37, 0).ToString("r K", CultureInfo.InvariantCulture)
|> equal "r "
DateTime(2014, 7, 1, 16, 37, 0, DateTimeKind.Utc).ToString("r K", CultureInfo.InvariantCulture)
|> equal "r Z"
// Timezone dependent (test is configured for Europe/Paris timezone)
// DateTime(2014, 7, 1, 16, 37, 0, DateTimeKind.Local).ToString("r K", CultureInfo.InvariantCulture)
// |> equal "r +02:00"
DateTime(2014, 7, 1, 16, 3, 0).ToString("r m", CultureInfo.InvariantCulture)
|> equal "r 3"
DateTime(2014, 7, 1, 16, 37, 0).ToString("r m", CultureInfo.InvariantCulture)
|> equal "r 37"
DateTime(2014, 7, 1, 16, 3, 0).ToString("r mm", CultureInfo.InvariantCulture)
|> equal "r 03"
DateTime(2014, 7, 1, 16, 37, 0).ToString("r mm", CultureInfo.InvariantCulture)
|> equal "r 37"
DateTime(2014, 7, 1, 16, 37, 0).ToString("r M", CultureInfo.InvariantCulture)
|> equal "r 7"
DateTime(2014, 11, 1, 16, 37, 0).ToString("r M", CultureInfo.InvariantCulture)
|> equal "r 11"
DateTime(2014, 7, 1, 16, 37, 0).ToString("r MM", CultureInfo.InvariantCulture)
|> equal "r 07"
DateTime(2014, 11, 1, 16, 37, 0).ToString("r MM", CultureInfo.InvariantCulture)
|> equal "r 11"
DateTime(2014, 1, 1, 16, 37, 0).ToString("r MMM", CultureInfo.InvariantCulture)
|> equal "r Jan"
DateTime(2014, 2, 1, 16, 37, 0).ToString("r MMM", CultureInfo.InvariantCulture)
|> equal "r Feb"
DateTime(2014, 3, 1, 16, 37, 0).ToString("r MMM", CultureInfo.InvariantCulture)
|> equal "r Mar"
DateTime(2014, 4, 1, 16, 37, 0).ToString("r MMM", CultureInfo.InvariantCulture)
|> equal "r Apr"
DateTime(2014, 5, 1, 16, 37, 0).ToString("r MMM", CultureInfo.InvariantCulture)
|> equal "r May"
DateTime(2014, 6, 1, 16, 37, 0).ToString("r MMM", CultureInfo.InvariantCulture)
|> equal "r Jun"
DateTime(2014, 7, 1, 16, 37, 0).ToString("r MMM", CultureInfo.InvariantCulture)
|> equal "r Jul"
DateTime(2014, 8, 1, 16, 37, 0).ToString("r MMM", CultureInfo.InvariantCulture)
|> equal "r Aug"
DateTime(2014, 9, 1, 16, 37, 0).ToString("r MMM", CultureInfo.InvariantCulture)
|> equal "r Sep"
DateTime(2014, 10, 1, 16, 37, 0).ToString("r MMM", CultureInfo.InvariantCulture)
|> equal "r Oct"
DateTime(2014, 11, 1, 16, 37, 0).ToString("r MMM", CultureInfo.InvariantCulture)
|> equal "r Nov"
DateTime(2014, 12, 1, 16, 37, 0).ToString("r MMM", CultureInfo.InvariantCulture)
|> equal "r Dec"
DateTime(2014, 1, 1, 16, 37, 0).ToString("r MMMM", CultureInfo.InvariantCulture)
|> equal "r January"
DateTime(2014, 2, 1, 16, 37, 0).ToString("r MMMM", CultureInfo.InvariantCulture)
|> equal "r February"
DateTime(2014, 3, 1, 16, 37, 0).ToString("r MMMM", CultureInfo.InvariantCulture)
|> equal "r March"
DateTime(2014, 4, 1, 16, 37, 0).ToString("r MMMM", CultureInfo.InvariantCulture)
|> equal "r April"
DateTime(2014, 5, 1, 16, 37, 0).ToString("r MMMM", CultureInfo.InvariantCulture)
|> equal "r May"
DateTime(2014, 6, 1, 16, 37, 0).ToString("r MMMM", CultureInfo.InvariantCulture)
|> equal "r June"
DateTime(2014, 7, 1, 16, 37, 0).ToString("r MMMM", CultureInfo.InvariantCulture)
|> equal "r July"
DateTime(2014, 8, 1, 16, 37, 0).ToString("r MMMM", CultureInfo.InvariantCulture)
|> equal "r August"
DateTime(2014, 9, 1, 16, 37, 0).ToString("r MMMM", CultureInfo.InvariantCulture)
|> equal "r September"
DateTime(2014, 10, 1, 16, 37, 0).ToString("r MMMM", CultureInfo.InvariantCulture)
|> equal "r October"
DateTime(2014, 11, 1, 16, 37, 0).ToString("r MMMM", CultureInfo.InvariantCulture)
|> equal "r November"
DateTime(2014, 12, 1, 16, 37, 0).ToString("r MMMM", CultureInfo.InvariantCulture)
|> equal "r December"
DateTime(2014, 7, 1, 16, 37, 3).ToString("r s", CultureInfo.InvariantCulture)
|> equal "r 3"
DateTime(2014, 7, 1, 16, 37, 31).ToString("r s", CultureInfo.InvariantCulture)
|> equal "r 31"
DateTime(2014, 7, 1, 16, 37, 3).ToString("r ss", CultureInfo.InvariantCulture)
|> equal "r 03"
DateTime(2014, 7, 1, 16, 37, 31).ToString("r ss", CultureInfo.InvariantCulture)
|> equal "r 31"
DateTime(2014, 7, 1, 1, 37, 0).ToString("r t", CultureInfo.InvariantCulture)
|> equal "r A"
DateTime(2014, 7, 1, 16, 37, 0).ToString("r t", CultureInfo.InvariantCulture)
|> equal "r P"
DateTime(2014, 7, 1, 1, 37, 0).ToString("r tt", CultureInfo.InvariantCulture)
|> equal "r AM"
DateTime(2014, 7, 1, 16, 37, 0).ToString("r tt", CultureInfo.InvariantCulture)
|> equal "r PM"
DateTime(1,1,1).ToString("r y", CultureInfo.InvariantCulture)
|> equal "r 1"
DateTime(0900,1,1).ToString("r y", CultureInfo.InvariantCulture)
|> equal "r 0"
DateTime(1900,1,1).ToString("r y", CultureInfo.InvariantCulture)
|> equal "r 0"
DateTime(2009,1,1).ToString("r y", CultureInfo.InvariantCulture)
|> equal "r 9"
DateTime(2019,1,1).ToString("r y", CultureInfo.InvariantCulture)
|> equal "r 19"
DateTime(1,1,1).ToString("r yy", CultureInfo.InvariantCulture)
|> equal "r 01"
DateTime(0900,1,1).ToString("r yy", CultureInfo.InvariantCulture)
|> equal "r 00"
DateTime(1900,1,1).ToString("r yy", CultureInfo.InvariantCulture)
|> equal "r 00"
DateTime(2009,1,1).ToString("r yy", CultureInfo.InvariantCulture)
|> equal "r 09"
DateTime(2019,1,1).ToString("r yy", CultureInfo.InvariantCulture)
|> equal "r 19"
DateTime(1,1,1).ToString("r yyy", CultureInfo.InvariantCulture)
|> equal "r 001"
DateTime(0900,1,1).ToString("r yyy", CultureInfo.InvariantCulture)
|> equal "r 900"
DateTime(1900,1,1).ToString("r yyy", CultureInfo.InvariantCulture)
|> equal "r 1900"
DateTime(2009,1,1).ToString("r yyy", CultureInfo.InvariantCulture)
|> equal "r 2009"
DateTime(2019,1,1).ToString("r yyy", CultureInfo.InvariantCulture)
|> equal "r 2019"
DateTime(1,1,1).ToString("r yyyy", CultureInfo.InvariantCulture)
|> equal "r 0001"
DateTime(0900,1,1).ToString("r yyyy", CultureInfo.InvariantCulture)
|> equal "r 0900"
DateTime(1900,1,1).ToString("r yyyy", CultureInfo.InvariantCulture)
|> equal "r 1900"
DateTime(2009,1,1).ToString("r yyyy", CultureInfo.InvariantCulture)
|> equal "r 2009"
DateTime(2019,1,1).ToString("r yyyy", CultureInfo.InvariantCulture)
|> equal "r 2019"
DateTime(1,1,1).ToString("r yyyyy", CultureInfo.InvariantCulture)
|> equal "r 00001"
DateTime(0900,1,1).ToString("r yyyyy", CultureInfo.InvariantCulture)
|> equal "r 00900"
DateTime(1900,1,1).ToString("r yyyyy", CultureInfo.InvariantCulture)
|> equal "r 01900"
DateTime(2009,1,1).ToString("r yyyyy", CultureInfo.InvariantCulture)
|> equal "r 02009"
DateTime(2019,1,1).ToString("r yyyyy", CultureInfo.InvariantCulture)
|> equal "r 02019"
DateTime(2014, 7, 1, 16, 37, 0, DateTimeKind.Utc).ToString("r z", CultureInfo.InvariantCulture)
|> equal "r +0"
// Timezone dependent (test is configured for Europe/Paris timezone)
// DateTime(2014, 7, 1, 16, 37, 0).ToString("r z", CultureInfo.InvariantCulture)
// |> equal "r +2"
// DateTime(2014, 7, 1, 16, 37, 0, DateTimeKind.Local).ToString("r z", CultureInfo.InvariantCulture)
// |> equal "r +2"
DateTime(2014, 7, 1, 16, 37, 0, DateTimeKind.Utc).ToString("r zz", CultureInfo.InvariantCulture)
|> equal "r +00"
// Timezone dependent (test is configured for Europe/Paris timezone)
// DateTime(2014, 7, 1, 16, 37, 0).ToString("r zz", CultureInfo.InvariantCulture)
// |> equal "r +02"
// DateTime(2014, 7, 1, 16, 37, 0, DateTimeKind.Local).ToString("r zz", CultureInfo.InvariantCulture)
// |> equal "r +02"
DateTime(2014, 7, 1, 16, 37, 0, DateTimeKind.Utc).ToString("r zzz", CultureInfo.InvariantCulture)
|> equal "r +00:00"
// Timezone dependent (test is configured for Europe/Paris timezone)
// DateTime(2014, 7, 1, 16, 37, 0).ToString("r zzz", CultureInfo.InvariantCulture)
// |> equal "r +02:00"
// DateTime(2014, 7, 1, 16, 37, 0, DateTimeKind.Local).ToString("r zzz", CultureInfo.InvariantCulture)
// |> equal "r +02:00"
// Time separator
DateTime(2014, 7, 1, 16, 37, 0).ToString("r :", CultureInfo.InvariantCulture)
|> equal "r :"
// Date separator
DateTime(2014, 7, 1, 16, 37, 0).ToString("r /", CultureInfo.InvariantCulture)
|> equal "r /"
// String quotation
DateTime(2014, 7, 1, 16, 37, 0).ToString("r \"hh\" h", CultureInfo.InvariantCulture)
|> equal "r hh 4"
DateTime(2014, 7, 1, 16, 37, 0).ToString("r 'hh' h", CultureInfo.InvariantCulture)
|> equal "r hh 4"
DateTime(2014, 7, 1, 16, 37, 0).ToString("r \'hh\'", CultureInfo.InvariantCulture)
|> equal "r hh"
// Format character
DateTime(2014, 7, 1, 16, 37, 0).ToString("r %h", CultureInfo.InvariantCulture)
|> equal "r 4"
DateTime(2014, 7, 1, 16, 37, 0).ToString("r %hh", CultureInfo.InvariantCulture)
|> equal "r 44"
// Escape character
DateTime(2014, 7, 1, 16, 37, 0, DateTimeKind.Utc).ToString("r \zz", CultureInfo.InvariantCulture)
|> equal "r z+0"
DateTime(2014, 7, 1, 16, 37, 0, DateTimeKind.Utc).ToString("r \\zz", CultureInfo.InvariantCulture)
|> equal "r z+0"
DateTime(2014, 7, 1, 16, 37, 0, DateTimeKind.Utc).ToString("r \\\zz", CultureInfo.InvariantCulture)
|> equal "r \+00"
DateTime(2014, 7, 1, 16, 37, 0, DateTimeKind.Utc).ToString("r \\z\\z", CultureInfo.InvariantCulture)
|> equal "r zz"
// Escape character with verbatim string
DateTime(2014, 7, 1, 16, 37, 0, DateTimeKind.Utc).ToString("""r \zz""", CultureInfo.InvariantCulture)
|> equal "r z+0"
DateTime(2014, 7, 1, 16, 37, 0, DateTimeKind.Utc).ToString("""r \\zz""", CultureInfo.InvariantCulture)
|> equal "r \+00"
DateTime(2014, 7, 1, 16, 37, 0, DateTimeKind.Utc).ToString("""r \\\zz""", CultureInfo.InvariantCulture)
|> equal "r \z+0"
[<Fact>]
let ``test DateTime.ToString without separator works`` () =
DateTime(2017, 9, 5).ToString("yyyyMM")
|> equal "201709"
[<Fact>]
let ``test DateTime.ToString with milliseconds`` () =
DateTime(2014, 9, 11, 16, 37, 11, 345).ToString("ss.fff")
|> equal "11.345"
[<Fact>]
let ``test DateTime.ToString("d") works`` () =
#if !FABLE_COMPILER
Threading.Thread.CurrentThread.CurrentCulture <- CultureInfo.InvariantCulture
#endif
DateTime(2014, 9, 11, 16, 37, 11, 345).ToString("d")
|> equal "09/11/2014"
DateTime(2014, 9, 1, 16, 37, 11, 345).ToString("d")
|> equal "09/01/2014"
// Needs to add (upper) and (lower) in the test name because
// the names of the function are lowered making them equal
[<Fact>]
let ``test DateTime.ToShortTimeString works`` () =
#if !FABLE_COMPILER
Threading.Thread.CurrentThread.CurrentCulture <- CultureInfo.InvariantCulture
#endif
DateTime(2014, 9, 11, 16, 37, 0).ToShortTimeString()
|> equal "16:37"
[<Fact>]
let ``test DateTime.ToLongTimeString works`` () =
#if !FABLE_COMPILER
Threading.Thread.CurrentThread.CurrentCulture <- CultureInfo.InvariantCulture
#endif
DateTime(2014, 9, 11, 16, 37, 0).ToLongTimeString()
|> equal "16:37:00"
[<Fact>]
let ``test DateTime.ToLongDateString works`` () =
#if !FABLE_COMPILER
Threading.Thread.CurrentThread.CurrentCulture <- CultureInfo.InvariantCulture
#endif
DateTime(2014, 9, 11, 16, 37, 0).ToLongDateString()
|> equal "Thursday, 11 September 2014"
[<Fact>]
let ``test DateTime.ToShortDateString works`` () =
#if !FABLE_COMPILER
Threading.Thread.CurrentThread.CurrentCulture <- CultureInfo.InvariantCulture
#endif
DateTime(2014, 9, 11, 16, 37, 0).ToShortDateString()
|> equal "09/11/2014"
[<Fact>]
let ``test DateTime.ToString("T") (upper) works`` () =
#if FABLE_COMPILER
DateTime(2014, 9, 11, 3, 37, 11, 345).ToString("T")
#else
DateTime(2014, 9, 11, 3, 37, 11, 345).ToString("T", CultureInfo.InvariantCulture)
#endif
|> equal "03:37:11"
#if FABLE_COMPILER
DateTime(2014, 9, 11, 16, 37, 11, 345).ToString("T")
#else
DateTime(2014, 9, 11, 16, 37, 11, 345).ToString("T", CultureInfo.InvariantCulture)
#endif
|> equal "16:37:11"
[<Fact>]
let ``test DateTime.ToString("t") (lower) works`` () =
#if FABLE_COMPILER
DateTime(2014, 9, 11, 3, 37, 11, 345).ToString("t")
#else
DateTime(2014, 9, 11, 3, 37, 11, 345).ToString("t", CultureInfo.InvariantCulture)
#endif
|> equal "03:37"
#if FABLE_COMPILER
DateTime(2014, 9, 11, 16, 37, 11, 345).ToString("t")
#else
DateTime(2014, 9, 11, 16, 37, 11, 345).ToString("t", CultureInfo.InvariantCulture)
#endif
|> equal "16:37"

@joprice
Copy link
Contributor

joprice commented Dec 15, 2024

"R" would be a convenient one to support (rfc1123), useful for things like last-modified headers as it's one of the formats for rfc2616 http date formats: https://www.rfc-editor.org/rfc/rfc2616.

Via fsi:

> DateTime.Now.ToString("R");;
val it: string = "Sun, 15 Dec 2024 14:58:27 GMT"

But fable currently fails with Unrecognized Date print format.

@joprice
Copy link
Contributor

joprice commented Dec 15, 2024

Working around this by grabbing the format from fsi:

> System.Globalization.CultureInfo.InvariantCulture.DateTimeFormat.RFC1123Pattern;;
val it: string = "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'"

and passing that to DateTime.ToString's format parameter.

Note that I can't use the pattern directly as it's not implemented: System.Globalization.DateTimeFormatInfo.get_RFC1123Pattern is not supported by Fable

@MangelMaxime
Copy link
Member Author

I forgot to close this issue, the re-implementation of DateTime.ToString has been completed for JavaScript too.

But it seems like I didn't implement all of the pre-defined format defined here:

https://github.com/microsoft/referencesource/blob/51cf7850defa8a17d815b4700b67116e3fa283c2/mscorlib/system/globalization/datetimeformat.cs#L99-L124


Note that I can't use the pattern directly as it's not implemented: System.Globalization.DateTimeFormatInfo.get_RFC1123Pattern is not supported by Fable

This is expected, Fable does not support Globalization API. At best, we allow the API to be used in the code but it will not have any effect. I think in the past Fable emit warnings when encountering something like DateTime.Now.ToString("O", CultureInfo.InvariantCulture) but that does not seems to be the case anymore. Probably to not pollute the output too much.

This was done so people can share more easily code between .NET and Fable runtime, without having to use a lot of compiler directives.

REPL Demo

@MangelMaxime
Copy link
Member Author

I am closing this issue in favor of #3976

@joprice Thank you for the bug report on missing pre-defined format support.

@MangelMaxime
Copy link
Member Author

Oups, I didn't understand what System.Globalization.CultureInfo.InvariantCulture.DateTimeFormat.RFC1123Pattern was.

This is actually just a static string and don't really imply to support Globalization in Fable, we could perhaps add support for such hardcoded properties. The difficulty is where to draw the line of what is support and what is not.

@joprice If we add support for R format, do you think that would be enough for your use case?

@joprice
Copy link
Contributor

joprice commented Dec 16, 2024

Yes I only used the static string as a word around to find out a valid pattern that will work to pass to the date format function. If R was supported, I would just remove that hardcoded format and switch to using R.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants