このサイトプログラム備忘録(1)─日時処理クラス
 このサイトはPythonとSQLiteを使った「簡易CMS」で作成されておりまして、その途上で気づいたことを備忘録的に記しておこうと思います。

 SQLiteは「日付」のデータ型がありません。なので、日時を入れておきたいときは「文字列」にせざるを得ないのですが、Pythonで処理する時はdatetimeオブジェクトにした方が何かと便利です。特に、このシステムでは個々の記事のファイル名を、年ディレクトリー月ディレクトリー日付_その日の何番ポスト.html、みたいにすることに決めたので、日付関連データの処理はやたらに出てくることになります。

 というわけなので、さすがにこれはクラスを作って処理した方がよいだろうということで、まず、新規のポストをデータベースに入れる時に、
  #現在日時のdatetimeオブジェクトを変数nowに代入
  now = datetime.datetime.now()
  #nowを「年-月-日-時-分-秒」と「-」をセパレータにした文字列に変換して変数nowstrに代入
  nowstr = now.strftime("%Y-%m-%d-%H-%M-%S")
と、後々便利なようにセパレート文字を統一した文字列にしておいて、使う時は以下のようなクラスでdatetimeオブジェクトとして値を保持しつつ、いろんなパターンの日付系文字列を吐き出すメソッドを用意しておく、という感じです。
class Time_obj(object):
  def __init__(self,post_datetime):
    #インスタンス化するときの引数を変数datetimeに代入
    self.datetime = post_datetime
    #変数datetimeを「-」をセパレータに6つに分割してそれぞれをリストdt_listの要素として格納
    self.dt_list = self.datetime.split('-',6)
    #それら6つの要素を整数としてtime_objectという名前のdatetimeオブジェクトを作成
    self.time_object = datetime.datetime(int(self.dt_list[0]),int(self.dt_list[1]),int(self.dt_list[2]),int(self.dt_list[3]),int(self.dt_list[4]),int(self.dt_list[5]))
  #以下はそのdatetimeオブジェクトから状況に応じた日付系文字列を取り出すためのメソッド群
  def ymdtime(self):
    self.result = self.time_object.strftime("%Y-%m-%d %H:%m")
    return self.result
  def ymd(self):
    self.result = self.time_object.strftime("%Y-%m-%d")
    return self.result
  def ym(self):
    self.result = self.time_object.strftime("%Y-%m")
    return self.result
  def year(self):
    self.result = self.time_object.strftime("%Y")
    return self.result
  def month(self):
    self.result = self.time_object.strftime("%m")
    return self.result
  def day(self):
    self.result = self.time_object.strftime("%d")
    return self.result
  def time(self):
    self.result = self.time_object.strftime("%H:%M")
    return self.result
 これを例えば tObj = Time_obj(post_datatime)などと、データベースの当該日付を引数にインスタンス化すれば、年の文字列を取り出したいときにはtObj.year()で、年-月の文字列ならtObj.ym()とやれば取り出せることになります。datetimeクラスにはインスタンス.yearで年の数値、インスタンス.hourで時間の数値を取り出すメソッドもあるのですが、このプログラムでは文字列として扱うだけだし、一つのインスタンスで済むように文字列用メソッドを定義してます。