@@ -239,7 +239,7 @@ PyObject *make_py_date(int y, int m, int d) {
239239 return date ;
240240}
241241
242- PyObject * make_py_time (int h , int min , int sec , int mi ) {
242+ PyObject * make_py_time (int64_t h , int64_t min , int64_t sec , int64_t mi ) {
243243 PyObject * time = PyTime_FromTime (h , min , sec , mi );
244244 if (!time ) {
245245 PyErr_Print ();
@@ -279,15 +279,28 @@ PyObject *mg_date_to_py_date(const mg_date *date) {
279279}
280280
281281PyObject * mg_local_time_to_py_time (const mg_local_time * lt ) {
282- long nanos = mg_local_time_nanoseconds (lt );
283- long one_sec_to_nanos = 1000000000 ;
284- SCOPED_CLEANUP PyObject * seconds = PyLong_FromLong (nanos / one_sec_to_nanos );
285- long leftover_nanos = nanos % one_sec_to_nanos ;
282+ const int64_t nanos = mg_local_time_nanoseconds (lt );
283+ const int64_t one_sec_to_nanos = 1000000000 ;
284+ SCOPED_CLEANUP PyObject * seconds =
285+ PyLong_FromLongLong (nanos / one_sec_to_nanos );
286+ const int64_t leftover_nanos = nanos % one_sec_to_nanos ;
287+ // The reason for different implementation of getting utc time from timestamp
288+ // is because we need to explicitly define utc timezone on Windows unlike on
289+ // linux, but that API is only allowed in py3.7, therefore the support for
290+ // Windows is only for python version >= 3.7.
291+ #ifdef _WIN32
292+ SCOPED_CLEANUP PyObject * method_name = PyUnicode_FromString ("fromtimestamp" );
293+ IF_PTR_IS_NULL_RETURN (method_name , NULL );
294+ SCOPED_CLEANUP PyObject * result = PyObject_CallMethodObjArgs (
295+ (PyObject * )PyDateTimeAPI -> DateTimeType , method_name , seconds ,
296+ PyDateTime_TimeZone_UTC , NULL );
297+ #else
286298 SCOPED_CLEANUP PyObject * method_name =
287299 PyUnicode_FromString ("utcfromtimestamp" );
288300 IF_PTR_IS_NULL_RETURN (method_name , NULL );
289- SCOPED_CLEANUP PyObject * result =
290- PyObject_CallMethodObjArgs ((PyObject * )PyDateTimeAPI -> DateTimeType , method_name , seconds , NULL );
301+ SCOPED_CLEANUP PyObject * result = PyObject_CallMethodObjArgs (
302+ (PyObject * )PyDateTimeAPI -> DateTimeType , method_name , seconds , NULL );
303+ #endif
291304 IF_PTR_IS_NULL_RETURN (result , NULL );
292305 SCOPED_CLEANUP PyObject * h = PyObject_GetAttrString (result , "hour" );
293306 IF_PTR_IS_NULL_RETURN (h , NULL );
@@ -307,8 +320,8 @@ PyObject *mg_local_date_time_to_py_datetime(const mg_local_date_time *ldt) {
307320 IF_PTR_IS_NULL_RETURN (seconds , NULL );
308321 SCOPED_CLEANUP PyObject * method_name = PyUnicode_FromString ("fromtimestamp" );
309322 IF_PTR_IS_NULL_RETURN (method_name , NULL );
310- SCOPED_CLEANUP PyObject * result =
311- PyObject_CallMethodObjArgs (( PyObject * )PyDateTimeAPI -> DateTimeType , method_name , seconds , NULL );
323+ SCOPED_CLEANUP PyObject * result = PyObject_CallMethodObjArgs (
324+ ( PyObject * )PyDateTimeAPI -> DateTimeType , method_name , seconds , NULL );
312325 IF_PTR_IS_NULL_RETURN (result , NULL );
313326 SCOPED_CLEANUP PyObject * y = PyObject_GetAttrString (result , "year" );
314327 SCOPED_CLEANUP PyObject * mo = PyObject_GetAttrString (result , "month" );
@@ -495,9 +508,7 @@ int64_t microseconds_to_nanos(int64_t microseconds) {
495508 return microseconds * 1000 ;
496509}
497510
498- int64_t seconds_to_nanos (int64_t seconds ) {
499- return microseconds_to_nanos (seconds * 1000000 );
500- }
511+ int64_t seconds_to_nanos (int64_t seconds ) { return seconds * 1000000 * 1000 ; }
501512
502513int64_t minutes_to_nanos (int64_t minutes ) {
503514 return seconds_to_nanos (minutes * 60 );
@@ -506,10 +517,10 @@ int64_t minutes_to_nanos(int64_t minutes) {
506517int64_t hours_to_nanos (int64_t hours ) { return minutes_to_nanos (hours * 60 ); }
507518
508519int64_t nanoseconds_since_epoch (PyObject * obj ) {
509- int h = PyDateTime_TIME_GET_HOUR (obj );
510- int m = PyDateTime_TIME_GET_MINUTE (obj );
511- int s = PyDateTime_TIME_GET_SECOND (obj );
512- int mi = PyDateTime_TIME_GET_MICROSECOND (obj );
520+ int64_t h = PyDateTime_TIME_GET_HOUR (obj );
521+ int64_t m = PyDateTime_TIME_GET_MINUTE (obj );
522+ int64_t s = PyDateTime_TIME_GET_SECOND (obj );
523+ int64_t mi = PyDateTime_TIME_GET_MICROSECOND (obj );
513524 return hours_to_nanos (h ) + minutes_to_nanos (m ) + seconds_to_nanos (s ) +
514525 microseconds_to_nanos (mi );
515526}
0 commit comments