天使の数を見つけてください
アプリケーションでの日付と時刻の操作
私はプロの開発者として約6年になります。この6年間、私は会社や、何らかの形で日付と時刻の問題に苦しんでいないプロジェクトで働いたことはありません。
作業するほぼすべてのアプリケーションでは、何らかの方法で時間を使用する必要があります。つまり、ある時点で、日付または時刻を収集、保存、取得、および表示する必要があります。日付や時刻を処理する特効薬はなく、時間の概念に伴う固有の複雑さから逃れることはできませんが、苦痛を軽減するために実行できる手順はあります。
さまざまなプログラミング言語で時間をかけて作業してきた数年間で、次の知識が大いに役立つことがわかりました。
適切なデータ形式の選択
時間と日付を操作するときの最初のステップは、データの表現を選択することです。異なる形式は多かれ少なかれ同じように見えるかもしれませんが、選択する形式は、コードの記述とデバッグの方法に大きな影響を与えます。
日付が必要なときに数値のタイムスタンプを使用するということは、日付のタイムスタンプを解析し、そこから日付を取得することを意味します。これは、タイムゾーンによって簡単な場合とそうでない場合があります。
122エンジェルナンバー
カスタム文字列を使用して期間を表すことは、保存と操作が簡単に思えますが、クエリを実行するのは困難です。さらに、人間の目ではすぐに認識できない種類の表現を使用すると、コードのデバッグがより困難になります。
日付または時刻の形式を選択するときは、次の規則に従います。
- 数値のタイムスタンプは絶対に使用しないでください。多くの場合、さまざまなプログラミング言語の中で標準ライブラリを使用するのが最も簡単ですが、人間が読める形式ではなく、操作したいという誘惑が強すぎます。
- 従う ISO 8601 、日付と時刻に関連するデータの形式を定義する標準。 ISO8601のバリエーションを処理できる任意の言語のライブラリを見つけるのは簡単です。
- ISO 8601は標準ですが、さまざまなバリエーションがあります。 ISO 8601の最も人間が読める形式を常に選択する必要があります。これにより、余分な労力は必要ありませんが、デバッグが容易になります。
- タイムスタンプ文字列には、絶対に必要なデータのみを含める必要があります。時間で作業する場合、文字列に日付を含めることはできません。また、タイムゾーンに依存しない日付で作業する場合、文字列にタイムゾーンを含めることはできません。追加情報を追加すると、解析操作と将来の開発者のデータの意図があいまいになります。
- タイムゾーンを保存するときは、タイムスタンプで常に同じタイムゾーンに正規化します。これにより、コンピューターがデータを並べ替えて処理しやすくなるだけでなく、人間の開発者にとっても簡単になります。
これらのルールを順守することは、前もってそれほど費用はかかりませんが、アプリケーションが確立され、時間と日付の使用法が期待したものではないことがわかったときに、生活が楽になります。
適切なツールの選択
私たちの業界のほとんどの問題と同様に、時間と日付の処理は、仕事に適したツールを選択することに帰着します。
お気に入りの言語の標準ライブラリにあるツールを使いたくなりますが、それが最善の選択ではない場合があります。一部の標準ライブラリには素晴らしい日付と時刻の機能(Python)がありますが、他のライブラリはまったく哀れです(Javascript)。間違ったツールを使用すると、時間に基づいて機能を開発することがはるかに難しくなり、バグがアプリケーションに侵入しやすくなります。
日付と時刻を処理するための優れたライブラリを使用すると、上記の5つのルールに従うことができます。具体的には、次のことができるはずです。
- 遭遇する可能性のある日付表現(外部表現を含む)を解析します。
- 必要になる可能性のある任意の日付表現(外部表現を含む)に出力します。
- 時間の単位を加算または減算して、日付と時刻を操作します。
- 日付と時刻を比較します。
- タイムゾーン間で正しく変換します。
ライブラリがこれらの機能をサポートしていることが重要です。サポートしていないと、自分で機能を実装しようとする誘惑が高すぎます。そして、明確にするために、その機能のいずれかを自分で実装しようとすると、失敗します。
独自のタイムスタンプを正規表現で解析したり、数値のタイムスタンプに秒を追加したりしないでください。これは、通常の数値のように見え、等式演算子を使用して日付と時刻を比較しないためです。これらのライブラリが存在するのは、これらの問題を解決するのが難しく、アプリケーションで車輪の再発明を行うと、車輪が壊れてしまうためです。
以下に、これらの基準に適合するライブラリに関するいくつかの提案を示します。
言語 | 図書館 |
Python | 標準ライブラリ |
Javascript | 瞬間 そして モーメントタイムゾーン |
Java8以降 | 標準ライブラリ (java.time) |
Java7以下 | ジョーダタイム |
迅速 | SwiftDate |
あなたの言語がリストにない場合(私はそれについて十分に精通していないため)、日付と時刻のライブラリを検索してください。必要なことをすべて実行できる優れたライブラリが見つかる可能性があります。
時間について知る
私が共有しなければならない最後の知識は、日付と時刻の操作に固有のものではありませんが、問題を回避するのに役立つ一般的な哲学であり、プログラミングの他のすべての問題と同じように日付と時刻の処理に適用されます。
常にあなたの仮定をチェックしてください。
私たちは、多くの知識とさらに多くの仮定を用いて提示されたすべての問題に取り組みます。日付と時刻を処理するときは、仮定をチェックして、シナリオに当てはまることを確認することがこれまで以上に重要になります。
このリスト 「FalsehoodsProgrammersBelieve About Time」というタイトルのは、時間がおそらくあなたが思っていたものではないことを示す多くの優れた例を示しています。時間を中心とした機能を設計または開発する場合は、パートナーを取得してこのリストを確認し、リストされている落とし穴を回避することをお勧めします。
時間のバグは、キャッチするのが難しいことで有名であり、テストするのはさらに困難です。このリストを念頭に置いて開発すれば、顧客に影響を与えるが顧客が捕まえないかもしれない微妙なバグを回避できるかもしれません(最悪の種類のバグ!)
時間帯
時間帯についての言及がなければ、時間や日付についての議論は完了しません。上記の一般的な虚偽に精通することに加えて、タイムゾーンの基本にも精通してください。
タイムゾーンは、「すべて理解されている」と思っていても、時間で作業するときは常に問題になります。タイムゾーンについて少し知識があると、思考の中心になり、時間を操作するときに論理エラーが発生しないようにするのに役立ちます。
残念ながら、プログラミング時に時間と日付を保存および操作することの難しさを完全に回避する方法はありません。ただし、これらの手順に従い、この知識を念頭に置いて作業する場合は、作成する必要のあるコードの量を減らし、問題を引き起こす可能性が低いパラダイムに自分自身を強制することで、タスクを簡単にすることができます。
友達と共有してください: