0

私の目的は、電子メールで使用される -0700 のようなタイム ゾーン文字列を出力することです。具体的には、夏時間を含めた正確なタイム ゾーンを反映させたいと考えています。つまり、カリフォルニアでは夏は -0700、冬はカリフォルニアで -0800、中国では常に +0800 (夏時間なし) になります。

次の 2 つの理由から難しいと思います。

  1. Python の整数除算は、C99 や通常の C/C++ 実装とは異なり、常にゼロではなく下限に向かって丸められます。(これは、-xx30 のようなタイム ゾーンを含む計算に関係します)。
  2. struct_time.tm_isdst と time.daylight は、夏時間が有効かどうかを反映しません。

私は次のようなコードになりました。予想よりも長いです (特に Python の場合!):

import math
import time

def my_divide(dividend, divisor):
    if dividend < 0:
        if divisor < 0:
            diff_sign = False
        else:
            diff_sign = True
    else:
        if divisor >= 0:
            diff_sign = False
        else:
            diff_sign = True
    if diff_sign:
        return (int(math.ceil(1.0 * dividend / divisor)), dividend % -divisor)
    else:
        return (int(math.floor(1.0 * dividend / divisor)), dividend % divisor)

def my_timezone():
    gt = time.gmtime()
    lt = time.localtime()
    lt_write = list(lt)
    lt_write[8] = 0  # is_dst
    lt = time.struct_time(lt_write)
    seconds = time.mktime(lt) - time.mktime(gt)
    (hours, minutes) = my_divide(seconds, 3600)
    minutes = abs(minutes) // 60
    return '%(hours)+03d%(minutes)02d' % {'hours': hours, 'minutes': minutes}

より良い実装を持っている人はいますか?

4

1 に答える 1