この記事は クソアプリ 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,
}