Creatime is new time system

この記事は クソアプリ Advent Calendar 2015 の 23 日目の記事です。

Creatime は、クリエイティブな何かを生み出すために、 人間性を捨てたその先にある 新たな「時間体系」です。

Overview

Creatime では、一週間を「6分割」することにより、 1日を24時間ではなく28時間として体験することが出来ます。素晴らしいですね。

Creatime を導入すれば、 「1日が短すぎる!」というクリエイターたちの誰しもが抱える問題を解決することが出来ます。

Related works

山崎えり子の28時間時計

概要

節約のプロが、今度は時間を節約。自分の時間を持つために考えだした方法とは…。楽しく読めて役立つ1冊。

考察

山崎さんも「28時間」の時間体系を提案しています。 しかし、「1時間を50分」と捉えることにより、1日を28時間にしているのです。

それ「28時間」になってないじゃん。

それ「28時間」に! なって! ないじゃん! そうです。1時間の定義を変更してしまっては、当初の「1日を28時間にしたい」という要望が満たせていないのです。

Requirement

要求の整理

本来の要望を満たすために必要なものは何か。整理しましょう。
必須条件は以下のとおりですね。

  • 1分  = 60秒
  • 1時間 = 60分
  • 1日  = 28時間
  • 1週間 = [ 指定なし ]

なんとなく方向性が見えてきましたね。

方向性

上記条件を満たすことを再優先で考えましょう。
以下の等式が成り立つことに気づいたでしょうか?

24h × 7日 = 28h × 6日

1週間を6日にすれば、28h時計を実現できるわけです。

Implementation

ここでは、便宜上以下の用語を使用します。
Datetime(DT):通常の24h時計
Creatime(CT):28h時計

Creatime の定義

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進数で可能となります。

  • s :最初の水曜日の日付け
  • w :その日が何週目か
  • d :その日が何曜日か

時間表記

Datetime は ISO 8601 yyyy-mm-ddThh:mm:ss みたいな形で定義されているので、近い形で再定義(KSO 8601)してみましょう。

Datetime(24h時計:ISO 8601 フォーマット)

10進数で表現する。

 yyyy-mm-dd T hh:mm:ss

  yyyy : 年
  mm   : 月
  dd   : 日
  hh   : 時
  mm   : 分
  ss   : 秒

Creatime(28h時計:KSO 8601 フォーマット)

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   : 秒

体系変換

dt2ct(24h時計 → 28h時計の変換)

# 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)

ct2dt(28h時計 → 24h時計の変換)

# 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)

dt2ct API

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'
}

ct2dt API

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,
}