@@ -11,18 +11,106 @@ public class DateTimeZoneExtensionsTests
11
11
internal const string DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffffffK" ;
12
12
13
13
[ Fact ]
14
- public void ToDateTime_Should_Convert_DateTimeTimeZone_To_DateTime ( )
14
+ public void ToDateTime_Should_Correctly_Convert_DateTimeString_To_UTCDateTimeObject ( )
15
15
{
16
+ var dateTimeString = "2019-01-25T06:37:39.8058788Z" ;
17
+ var expectedDateTime = DateTime . ParseExact ( dateTimeString , DateTimeFormat , CultureInfo . InvariantCulture ) . ToUniversalTime ( ) ;
18
+
16
19
DateTimeTimeZone dateTimeTimeZone = new DateTimeTimeZone
17
20
{
18
21
TimeZone = "UTC" ,
22
+ DateTime = dateTimeString
23
+ } ;
24
+
25
+ var actualDateTime = dateTimeTimeZone . ToDateTime ( ) ;
26
+
27
+ Assert . Equal ( expectedDateTime , actualDateTime ) ;
28
+ Assert . Equal ( expectedDateTime . Kind , actualDateTime . Kind ) ;
29
+ Assert . Equal ( DateTimeKind . Utc , actualDateTime . Kind ) ;
30
+
31
+ //scenario where the dateTime is not in UTC
32
+ dateTimeTimeZone = new DateTimeTimeZone
33
+ {
34
+ TimeZone = "UTC" ,
35
+ DateTime = "2019-01-25T06:37:39.8058788"
36
+ } ;
37
+ actualDateTime = dateTimeTimeZone . ToDateTime ( ) ;
38
+ Assert . Equal ( expectedDateTime , actualDateTime ) ;
39
+ Assert . Equal ( expectedDateTime . Kind , actualDateTime . Kind ) ;
40
+ Assert . Equal ( DateTimeKind . Utc , actualDateTime . Kind ) ;
41
+ }
42
+
43
+ [ Fact ]
44
+ public void ToDateTime_Should_Correctly_Convert_DateTimeString_To_Local_DateTimeObject_Correctly ( )
45
+ {
46
+ var localDateTime = DateTime . Now ;
47
+ var localDateTimeString = localDateTime . ToString ( DateTimeFormat , CultureInfo . InvariantCulture ) ;
48
+ DateTimeTimeZone dateTimeTimeZone = new DateTimeTimeZone
49
+ {
50
+ TimeZone = TimeZoneInfo . Local . Id ,
51
+ DateTime = localDateTimeString
52
+ } ;
53
+
54
+ var actualDateTime = dateTimeTimeZone . ToDateTime ( ) . ToLocalTime ( ) ;
55
+ var expectedDateTime = localDateTime ;
56
+
57
+ Assert . Equal ( expectedDateTime , actualDateTime ) ;
58
+ Assert . Equal ( expectedDateTime . Kind , actualDateTime . Kind ) ;
59
+ }
60
+
61
+ [ Fact ]
62
+ public void ToDateTime_Should_Correctly_Convert_DateTimeString_To_Local_No_timezone_offset_provided ( )
63
+ {
64
+ var localDateTime = DateTime . Now ;
65
+ var localDateTimeString = localDateTime . ToString ( "yyyy-MM-ddTHH:mm:ss.fffffff" , CultureInfo . InvariantCulture ) ;
66
+ DateTimeTimeZone dateTimeTimeZone = new DateTimeTimeZone
67
+ {
68
+ TimeZone = TimeZoneInfo . Local . Id ,
69
+ DateTime = localDateTimeString
70
+ } ;
71
+
72
+ var actualDateTime = dateTimeTimeZone . ToDateTime ( ) . ToLocalTime ( ) ;
73
+ var expectedDateTime = localDateTime ;
74
+ Assert . Equal ( expectedDateTime , actualDateTime ) ;
75
+ Assert . Equal ( expectedDateTime . Kind , actualDateTime . Kind ) ;
76
+ }
77
+
78
+ [ Fact ]
79
+ public void ToDateTime_Should_Correctly_Convert_DateTimeString_To_UnspecifiedDateTimeObject ( )
80
+ {
81
+ DateTimeTimeZone dateTimeTimeZone = new DateTimeTimeZone
82
+ {
83
+ TimeZone = "Asia/Jerusalem" ,
19
84
DateTime = "2019-01-25T06:37:39.8058788Z"
20
85
} ;
21
86
22
87
var actualDateTime = dateTimeTimeZone . ToDateTime ( ) ;
23
- var expectedDateTime = DateTime . ParseExact ( dateTimeTimeZone . DateTime , DateTimeFormat , CultureInfo . InvariantCulture ) ;
88
+ var expectedDateTime = DateTime . ParseExact ( dateTimeTimeZone . DateTime , DateTimeFormat , CultureInfo . InvariantCulture ) . ToUniversalTime ( ) ;
89
+
90
+ Assert . Equal ( expectedDateTime , actualDateTime . ToUniversalTime ( ) ) ;
91
+
92
+ //scenario where the dateTime is Local but the timezone is unspecified
93
+ expectedDateTime = DateTime . Now ;
94
+ var dateTimeString = expectedDateTime . ToString ( DateTimeFormat , CultureInfo . InvariantCulture ) ;
95
+ dateTimeTimeZone = new DateTimeTimeZone
96
+ {
97
+ TimeZone = "Asia/Jerusalem" ,
98
+ DateTime = dateTimeString
99
+ } ;
100
+ actualDateTime = dateTimeTimeZone . ToDateTime ( ) ;
101
+ Assert . Equal ( expectedDateTime , actualDateTime . ToLocalTime ( ) ) ;
102
+
103
+ //scenario where the dateTime has no timezone offset and timezone is unspecified
104
+ dateTimeTimeZone = new DateTimeTimeZone
105
+ {
106
+ TimeZone = "Asia/Jerusalem" ,
107
+ DateTime = "2024-01-16T08:30:00.0000000"
108
+ } ;
24
109
110
+ actualDateTime = dateTimeTimeZone . ToDateTime ( ) ;
111
+ expectedDateTime = new DateTime ( 2024 , 1 , 16 , 08 , 30 , 0 , DateTimeKind . Unspecified ) ;
25
112
Assert . Equal ( expectedDateTime , actualDateTime ) ;
113
+ Assert . Equal ( DateTimeKind . Unspecified , actualDateTime . Kind ) ;
26
114
}
27
115
28
116
[ Fact ]
0 commit comments