@@ -542,19 +542,57 @@ let ``test DateTime.ToString("t") (lower) works`` () =
542542
543543[<Fact>]
544544let ``test DateTime.ToString with Round - trip format works for Utc`` () =
545- let str = DateTime( 2014 , 9 , 11 , 16 , 37 , 2 , DateTimeKind.Utc) .ToString( " O" )
546- // FIXME: missing regex module
547- // System.Text.RegularExpressions.Regex.Replace(str, "0{3,}", "000")
548- // Hardcode the replace string so we can test that "O" format is supported
549- str.Replace( " 0000000Z" , " 000000Z" )
550- |> equal " 2014-09-11T16:37:02.000000Z"
551-
552- let str = DateTime( 2014 , 9 , 11 , 16 , 37 , 2 , DateTimeKind.Utc) .ToString( " o" )
553- // FIXME: missing regex module
554- // System.Text.RegularExpressions.Regex.Replace(str, "0{3,}", "000")
555- // Hardcode the replace string so we can test that "O" format is supported
556- str.Replace( " 0000000Z" , " 000000Z" )
557- |> equal " 2014-09-11T16:37:02.000000Z"
545+ DateTime( 2014 , 9 , 11 , 16 , 37 , 2 , DateTimeKind.Utc) .ToString( " O" )
546+ |> equal " 2014-09-11T16:37:02.0000000Z"
547+
548+ DateTime( 2014 , 9 , 11 , 16 , 37 , 2 , DateTimeKind.Utc) .ToString( " o" )
549+ |> equal " 2014-09-11T16:37:02.0000000Z"
550+
551+ [<Fact>]
552+ let ``test DateTime.ToString with Round - trip format works for Unspecified`` () =
553+ // The round-trip format must depend only on the value: an Unspecified
554+ // DateTime carries no offset, so none is printed whatever the host timezone.
555+ DateTime( 2014 , 9 , 11 , 16 , 37 , 2 ) .ToString( " O" )
556+ |> equal " 2014-09-11T16:37:02.0000000"
557+
558+ DateTime( 2014 , 9 , 11 , 16 , 37 , 2 , 345 ) .ToString( " o" )
559+ |> equal " 2014-09-11T16:37:02.3450000"
560+
561+ [<Fact>]
562+ let ``test DateTime.ToString with Round - trip format works for Local`` () =
563+ // A Local DateTime prints its own offset, which follows the host timezone,
564+ // so only the machine-independent part can be asserted literally.
565+ let str = DateTime( 2014 , 9 , 11 , 16 , 37 , 2 , DateTimeKind.Local) .ToString( " O" )
566+ str.Substring( 0 , 27 ) |> equal " 2014-09-11T16:37:02.0000000"
567+ str.Length |> equal 33
568+ let sign = str.[ 27 ]
569+ ( sign = '+' || sign = '-' ) |> equal true
570+ str.[ 30 ] |> equal ':'
571+
572+ [<Fact>]
573+ let ``test DateTime.ToString with Round - trip format pads the fraction to 7 digits`` () =
574+ // Sub-millisecond digits are padded on the right, not truncated.
575+ DateTime( 2014 , 9 , 11 , 16 , 37 , 2 , 345 , DateTimeKind.Utc) .ToString( " O" )
576+ |> equal " 2014-09-11T16:37:02.3450000Z"
577+
578+ DateTime( 2014 , 9 , 11 , 16 , 37 , 2 , 345 , 678 , DateTimeKind.Utc) .ToString( " O" )
579+ |> equal " 2014-09-11T16:37:02.3456780Z"
580+
581+ [<Fact>]
582+ let ``test DateTime.ToString with Round - trip format round - trips the instant`` () =
583+ let roundtrips ( d : DateTime ) =
584+ let parsed = DateTime.Parse( d.ToString( " O" ), CultureInfo.InvariantCulture)
585+ parsed.ToUniversalTime() |> equal ( d.ToUniversalTime())
586+
587+ roundtrips ( DateTime( 2014 , 9 , 11 , 16 , 37 , 2 , 345 ))
588+ roundtrips ( DateTime( 2014 , 9 , 11 , 16 , 37 , 2 , 345 , DateTimeKind.Utc))
589+ roundtrips ( DateTime( 2014 , 9 , 11 , 16 , 37 , 2 , 345 , DateTimeKind.Local))
590+
591+ // An Unspecified value has no offset to interpret, so its Kind survives too
592+ let unspecified = DateTime( 2014 , 9 , 11 , 16 , 37 , 2 , 345 )
593+ let parsed = DateTime.Parse( unspecified.ToString( " O" ), CultureInfo.InvariantCulture)
594+ parsed.Kind |> equal DateTimeKind.Unspecified
595+ parsed |> equal unspecified
558596
559597[<Fact>]
560598let ``test DateTime.ToString ( "R ") works`` () =
0 commit comments