名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

pythonで ISO8601 形式の日付形式を出すときにやってたことメモ

ニコニコ動画 『スナップショット検索 v2 API』 ガイド

これをいじっていたのですが、jsonFilterの形式を指定する際に日付形式で少し大変だったのでメモ。

ISO8601形式で出さないといけないが、 YYYY-MM-DDThh:mm:ss±hh:mm の形式を満たすためには所謂 Python の時刻の合使いでいうところの aware ではなく naive にしてから isoformat する必要がある。

あまり使いこなせていない感じだったので、調べてみると delta を使って timezone を作ってセットして、それをさらにタイムゾーン付きで入れたり、 replace したり、 astimezone とかでずらせばできるらしい。

isoformat は spec="seconeds" を引数にすると上記の hh:mm:ss 形式で取ることができる。

このあたりを参考にした

使ったのはこの辺のメソッド

出来たものはこんな感じ。APIの性質上、データ追加タイミングが限られるものなので少し検索範囲を長めにとっている。

PAST_DAY = 2

def get_past_days(days: int) -> datetime:
    tmp = date.today() - timedelta(days=days)
    return datetime.combine(tmp, time())


def past_day_to_now(days: int) -> Dict[str, Any]:
    jst = timezone(timedelta(hours=+9), 'JST')
    past_day = get_past_days(days=days).astimezone(jst)
    now = datetime.now(tz=jst)
    result = {
        "type": "and",
        "filters": [
            {
                "type": "range",
                "field": "startTime",
                "from": past_day.isoformat(timespec="seconds"),
                "to": now.isoformat(timespec="seconds"),
                "include_lower": True
            },
        ]
    }
    return json.dumps(result)

命名が微妙にな気がするけど一旦動いたのでよしとする。

ちなみに timezone 周りはここ最近よくなったらしいので pytz を使わなくても何とかなるような気もしてきました。