【追記あり】なにこれバグ?日時を計算しても思った通りの日付にならない

トッティなのですが。

あの、これはkintone界隈では周知の現象なのでしょうか。今更ながらに気づいたことがあるので、紹介しますね。

ま、先に言ってしまうと、「日時に足し算して日付を作成すると計算がズレることがある」っていう現象です。これだけでピンと来た人はすごい!僕、昨日(12/10)初めて気付きました。なんのこっちゃと感じている方、どういうことか、下記、説明しますね。

「日時」に計算を掛けあわせて「日付」を設定している

僕の環境で実際に起きた事象を紹介すると、これなんです。「日時」フィールドに足し算して、「日付」の表示をする。具体的に言ってしまうと、弊社のサービスのトライアル中ユーザーの管理アプリなんです。弊社のサービスは全てトライアルが可能なので、ほとんどのお客様がトライアルから本申し込み、の順に手続きをされるのですが、これをフォームクリエイターでお客様が入力した「作成日時」に30日を足して、「試用期日」という計算フィールドを設定しているわけです。

トライアル期間のイメージ。開始日含めず30日間まるまる使える
トライアル期間のイメージ。開始日含めず30日間まるまる使える

で、実際のkintoneの設定はというと、下記画像の感じです。時間計算、時刻計算をする時、計算する値は秒数で設定する必要があります。「作成日時」+「2592000」、この数値は30日間の秒数です。30(日)×24(時間)×60(分)×60(秒)で、2,592,000秒。例えば、「2016-01-01 11:00」にレコードが作成されたら、足し算を行って「2016-01-31 11:00」となります。時刻の表示は省いているので最終的にフィールドに表示されるのは「2016-01-31」となるのです。

2592000
2,592,000

弊社のサービスはトライアル期限日の夜中12時まで使えるので、時刻は省き日付で表示しています。これで今まで問題無く運用出来ていたのですが、昨日ハタと気づいたのです。

「ん、日付計算がズレてるレコードがある。。。?」

多くのレコードの中から、計算ズレを起こしているレコードを特定

現在、kintone連携サービスを4つリリースしている弊社。合わせて、常に100件程度トライアルユーザーがいらっしゃいます。トライアル期日を一覧で簡単に把握できるようにし、期日や確度を意識しながらフォローします。

ぱっと見でトライアル期日を把握
ぱっと見でトライアル期日を把握

で、だいたいはちゃんと計算できているのですが、、、

これ、計算間違ってない?
これ、計算間違ってない?

こんな具合に、計算違いをしているレコードが散見されます。なんでだろう・・・?

これもズレてる。。
これもズレてる。。
これも。。。
これも。。。

・・・で、僕って勘が鋭いじゃないですか。勘の切れ味が五枚刃ってよく言われるんですけど、ピンと来ちゃったんですよね。

「計算のズレは早朝登録されたレコードに多い!」

だから何?と言いたそうですね。違うんです。もうちょっと待ってください。もう犯人分かってるんです。

で、この境目となる「早朝」っていうのが多分9時だろうな〜、と思ったのですが、やっぱり9時でした。ガチャガチャテストしてみたのですが、計算結果が9時より早い時刻だと、一日前の日付が表示されるのです。

日付表示がズレる原因はUTC日本標準時刻!?

で、何故9時なのかと言うと、恐らくUTC+9の日本標準時刻が適用されるフィールドと、適用されないフィールドとがあるのでしょうね。もう、そこまでは今回調査しませんので、そのうちまた時間があったら。

ただ、日本語環境、日本のタイムゾーンで使っていて、「日時」を計算して「日付」にしただけでズレが発生するのは、仕様的にどうなんでしょうね。

どう対応するか

嘆いていてもしょうがないです。ユーザーサポートに使っている以上、ユーザーの方にご迷惑をかける可能性があります。自分たちでなんとかしましょう。

で、苦肉の策がこちらです笑

9時間分の秒数を追加!
9時間分の秒数を追加!

計算式の中に9時間分の秒数、32,400秒を追加しました。従来の30日(2,592,000秒)+9時間(32,400秒)で、2,624,400秒です。

これで、何時にトライアル申し込みが来ても問題無いです!僕、今回この計算ズレに30分くらい頭を抱えたので、この記事が誰かの救いになると、とても嬉しいです。

というよりも、僕も良く今まで気づきませんでしたね。。。(^_^;) それはそれで、反省。

それではまた。

【追記(12/15)】仕様でした!

仕様みたいです。計算フィールドの「日付」表示はタイムゾーン設定の影響を受けずUTCで表示される「日時」表示はユーザーのタイムゾーンを考慮する、という仕様の様です。記事をアップした当日中にサイボウズの方からご連絡いただきました。追記が遅くなり失礼しましたm(_ _)m

なので、上記のような問題を解決するためには、「日付」で統一するか、「日時」で統一するか、といった方法があります。ですが、弊社はこれからも「日時」と「日付」で管理したいので、「+9時間」運用で回避したいと思います。

以上です!


⭐️トヨクモ kintone連携サービスのおすすめポイント⭐️
・kintone標準機能ではできない業務改善を実現
・カンタン・低コストで運用可能
・kintone1ドメインにつき1契約でOK
・10,000契約以上の実績・信頼
・30日間の無料お試しは何度でも可能