この記事は クソアプリ Advent Calendar 2015 の 23 日目の記事です。
Creatime は、クリエイティブな何かを生み出すために、 人間性を捨てたその先にある 新たな「時間体系」です。
Creatime では、一週間を「6分割」することにより、 1日を24時間ではなく28時間として体験することが出来ます。素晴らしいですね。
Creatime を導入すれば、 「1日が短すぎる!」というクリエイターたちの誰しもが抱える問題を解決することが出来ます。
本来の要望を満たすために必要なものは何か。整理しましょう。
必須条件は以下のとおりですね。
なんとなく方向性が見えてきましたね。
上記条件を満たすことを再優先で考えましょう。
以下の等式が成り立つことに気づいたでしょうか?
24h × 7日 = 28h × 6日
1週間を6日にすれば、28h時計を実現できるわけです。
ここでは、便宜上以下の用語を使用します。
Datetime(DT):通常の24h時計
Creatime(CT):28h時計
Creatime では、1日の中の「時間」、そして1週間の中の「日(曜日)」を再定義しています。
1日が28時間になるので、午前午後も14時間ずつとなります。
時間の桁数がブレるのは美しくないので、16進数で表記することにします。
さらに、午前午後も 0・1 で表現することで、常に2桁で表現できますね。
1週間を6日に分割するわけですから、Datetimeの曜日表現(月火水木金土日)は適用できません。 そこで、Creatimeでは新しい曜日表現(A〜F)を定義します。
さらに、7日 → 6日 と1日減ることにより、Datetimeの日表現(1日〜31日)が適用できません。困りましたね。仕方がないので新しい日表現(swd)を定義します。
Creatimeの日表現は、次の3つの16進数で可能となります。
Datetime は ISO 8601 yyyy-mm-ddThh:mm:ss
みたいな形で定義されているので、近い形で再定義(KSO 8601)してみましょう。
10進数で表現する。
yyyy-mm-dd T hh:mm:ss yyyy : 年 mm : 月 dd : 日 hh : 時 mm : 分 ss : 秒
16進数で表現する。 ※ KSO 8601 : クソ ハチ ロク ゼロ イチ
yy-m-swd T ah:mm:ss yy : 年(dt.yyyy - 2000) m : 月 swd : 日 - s : 最初の水曜日の日付 - w : 週目(その日は何週目か) - d : 曜日(その日はCreatime上での何曜日か) ah : 時 - a : 午前(0)or午後(1) - h : 時 mm : 分 ss : 秒
# dt_year, dt_month, dt_day, dt_weekday, # dt_hour, dt_min, dt_sec を取得しておく wd = (dt_weekday + 5) % 7 #水曜日始まりに変更 acc_time = wd * 24 + dt_hour #水曜日からの累積時間 #-- 年・月 ct_year = "%x%x" % ( int((dt_year - 2000) / 16), (dt_year - 2000) % 16 ) ct_month = "%x" % dt_month #-- 日 ct_stday = (dt_day - wd) % 7 ct_week = int(1 + (dt_day - wd) / 7) ct_wd = "%x" % int(acc_time / 28 + 10) #-- 時・分・秒 ct_ampm = "%x" % int((acc_time % 28) / 14) ct_hour = "%x" % int((acc_time % 28) % 14) ct_min = "%x%x" % (int(dt_min/16), dt_min%16) ct_sec = "%x%x" % (int(dt_sec/16), dt_sec%16)
# ct_year, ct_month, ct_stday, ct_week, ct_wd, # ct_ampm, ct_hour, ct_min, ct_sec を取得しておく # 各々 int にキャストしておく acc_time = (ct_wd * 28 + ct_ampm * 14 + ct_hour) # A曜日からの累積時間 dt_year = 2000 + ct_year dt_month = ct_month dt_day = int(ct_stday \ + (ct_week - 1) * 7 \ + math.ceil(acc_time / 24)) dt_hour = acc_time % 24 dt_min = ct_min dt_sec = ct_sec dt = datetime.datetime(dt_year, dt_month, dt_day, dt_hour, dt_min, dt_sec)
UNIX タイムスタンプ と Datetime(ISO 8601)の2つの引数を取ることが出来ます。
from timestamp http://apps.fukitama.info/creatime/api/dt2ct/?timestamp=xxxxxxxxxxxx
from datetime http://apps.fukitama.info/creatime/api/dt2ct/?datetime=yyyy-mm-ddThh:mm:ss
JSON形式でデータを取得することができます。
{ 'timestamp': 1450917822000L, 'datetime': '0f-c-24bT05:2b:2a', 'date': '0f-c-24b', 'time': '05:2b:2a', 'year': '0f', 'month': 'c', 'day': '24b', 'startday': '2', 'week': '4', 'weekday': 'b', /* 水=a */ 'hour': '05', 'minute': '2b', 'second': '2a' }
UNIX タイムスタンプ と Creatime(KSO 8601)の2つの引数を取ることが出来ます。
from timestamp http://apps.fukitama.info/creatime/api/ct2dt/?timestamp=xxxxxxxxxxxx
from creatime http://apps.fukitama.info/creatime/api/ct2dt/?creatime=yy-m-swdTah:mm:ss
JSON形式でデータを取得することができます。
{ 'timestamp': 1450914089000L, 'datetime': '2015-12-24T08:41:29', 'date': '2015-12-24', 'time': '08:41:29', 'year': 2015, 'month': 12, 'day': 24, 'weekday': 3, /* 月=0 */ 'hour': 8, 'minute': 41, 'second': 29, }