@@ -985,28 +985,49 @@ def parse(self):
985985
986986class DateTimeStruct (Structure ):
987987 Ticks : int
988- Kind : enums . DateTimeKind
988+ Kind : int
989989
990990
991991class DateTime (object ):
992- def __init__ (self , rva : int , raw_bytes : bytes ):
992+ struct : Optional [DateTimeStruct ]
993+ kind : Optional [enums .DateTimeKind ]
994+ value : Optional [datetime .datetime ]
995+ seconds : Optional [int ]
996+ __data__ : bytes
997+
998+ def __init__ (self , raw_bytes : bytes , rva : Optional [int ] = None ):
993999 self .struct : Optional [DateTimeStruct ] = None
994- self .raw : bytes = raw_bytes
1000+ self .kind : Optional [ enums . DateTimeKind ] = None
9951001 self .value : Optional [datetime .datetime ] = None
1002+ self .seconds : Optional [int ] = None
1003+ self .__data__ : bytes = raw_bytes
1004+ self .rva : Optional [int ] = rva
9961005
9971006 def parse (self ):
998- if not self .raw :
1007+ if not self .__data__ :
9991008 # TODO: warn/error
10001009 return
1001- # Should be 64 bites
1002- if len (self .raw ) != 8 :
1010+ # Should be 64 bits
1011+ if len (self .__data__ ) != 8 :
10031012 # TODO: warn/error
10041013 return
1005- x = _struct .unpack ("<q" , self .raw )[0 ]
1014+ x = _struct .unpack ("<q" , self .__data__ )[0 ]
10061015 self .struct = DateTimeStruct ()
10071016 self .struct .Ticks = x & 0x3FFFFFFFFFFFFFFF
1017+ # Value is stored in lower 62-bits
1018+ # https://github.com/dotnet/runtime/blob/17c55f1/src/libraries/System.Private.CoreLib/src/System/DateTime.cs#L130-L138
10081019 self .struct .Kind = x >> 62
10091020 # https://stackoverflow.com/questions/3169517/python-c-sharp-binary-datetime-encoding
1010- secs = self .struct .Ticks / 10.0 ** 7
1011- delta = datetime .timedelta (seconds = secs )
1012- self .value = datetime .datetime (1 , 1 , 1 ) + delta
1021+ self .Seconds = self .struct .Ticks / 10.0 ** 7
1022+ self .Kind = enums .DateTimeKind (self .struct .Kind )
1023+ delta = datetime .timedelta (seconds = self .Seconds )
1024+ if self .Kind == enums .DateTimeKind .Utc :
1025+ self .value = datetime .datetime (1 , 1 , 1 , 0 , 0 , 0 , 0 , datetime .timezone .utc ) + delta
1026+ else :
1027+ self .value = datetime .datetime (1 , 1 , 1 , 0 , 0 , 0 , 0 ) + delta
1028+
1029+ def __str__ (self ) -> str :
1030+ return str (self .value )
1031+
1032+ def to_datetime (self ) -> Optional [datetime .datetime ]:
1033+ return self .value
0 commit comments