Pythonで2つのタイムスタンプの差を秒単位で求める方法
問題の概要
「Day dd Mon yyyy hh:mm:ss +/-xxxx」という形式で表された2つの時刻が与えられます。ここで、Dayは先頭が大文字の3文字の曜日名、Monは3文字の月名、そして「+」または「-」に続くxxxxはタイムゾーンを表します。たとえば「+0530」はGMTより5時間30分進んでいることを意味します(dd、hh、mm、ssなどのその他の項目は説明不要でしょう)。この2つのタイムスタンプの差を、秒単位の絶対値として求めるのが目的です。
解決のアプローチ
Pythonでこの問題を解くには、標準ライブラリのdatetimeモジュールを使用します。strptime()関数を使うと、文字列形式の日付をdatetimeオブジェクトに変換できます。変換時に使用する主な書式指定子は以下の通りです。
%a— 3文字形式の曜日(例:Thu)%d— 数値形式の日%b— 3文字形式の月名(例:Jul)%Y— yyyy形式の年%H— hh形式の時(24時間表記)%M— mm形式の分%S— ss形式の秒%z— +/-xxxx形式のタイムゾーン(UTCオフセット)
たとえば、入力が t1 = "Thu 15 Jul 2021 15:10:17 +0530"、t2 = "Thu 15 Jul 2021 20:25:29 +0720" の場合、出力は 12312 になります。
アルゴリズムの手順
- 1つ目の時刻文字列を、上記の書式指定子を使ってdatetimeオブジェクトに変換します。
- 2つ目の時刻文字列も同様にdatetimeオブジェクトに変換します。
- 2つのdatetimeオブジェクトの差を計算し、秒単位の絶対値として返します。
実装例
以下のコードで具体的な実装を確認してみましょう。
from datetime import datetime def solve(t1, t2): t1 = datetime.strptime(t1, "%a %d %b %Y %H:%M:%S %z") t2 = datetime.strptime(t2, "%a %d %b %Y %H:%M:%S %z") return abs(int((t1-t2).total_seconds())) t1 = "Thu 15 Jul 2021 15:10:17 +0530" t2 = "Thu 15 Jul 2021 20:25:29 +0720" print(solve(t1, t2))
入力
"Thu 15 Jul 2021 15:10:17 +0530", "Thu 15 Jul 2021 20:25:29 +0720"
出力
12312
コードのポイント
タイムゾーン情報を持つ(awareな)datetimeオブジェクト同士を引き算すると、timedeltaオブジェクトが得られます。total_seconds()メソッドはその時間差を秒数(float型)で返すため、int()で整数に変換し、abs()で絶対値を取ることで、どちらの時刻が後であっても常に正しい差を取得できます。また、%z指定子によってタイムゾーンのオフセットも自動的に考慮されるため、異なるタイムゾーン間の時刻比較でも正確な結果が得られる点が大きな利点です。
-
Pythonで数値が2の累乗かどうかを判定するプログラム
本記事では、与えられた数値が2の累乗(べき乗)であるかどうかを判定する方法について、考え方と実装手順をわかりやすく解説します。 問題の定義 ある整数 n が与えられたとき、その数が2の累乗(1, 2, 4, 8, 16, …)であるかどうかを判定します。 アプローチ 判定には「繰り返し2で割る」というシンプルな方法を使います。考え方は以下の通りです。 入力された数値 n を、1になるまで繰り返し2で割っていきます(n = n // 2)。 割る過程で n % 2 の結果が0以外(奇数)になり、かつ n が1でない場合は、その数は2の累乗ではありません。 最終的に n がちょうど1になれば、そ
-
Pythonでリスト内のすべてのペア間の絶対差の合計を求めるプログラム
本記事では、リスト内のすべてのペア間の絶対差の合計を求める問題の解法とアプローチについて解説します。 問題文 リストが入力として与えられたとき、そのリスト内のすべてのペア間の絶対差の合計を求める必要があります。 解法のアプローチ enumerate() メソッドは、イテラブル(反復可能オブジェクト)にカウンターを付加し、enumerate オブジェクトとして返す組み込み関数です。ループ処理の中でインデックスと要素を同時に取得したい場合に非常に便利です。 この手法では、まず絶対差を格納するためのリスト「diffs」を用意します。 次に、2つの変数を持つ二重ループを使用します。片方はカウンター(イ