blog

プログラムにおける時間問題のまとめ

プログラム内の日付と時刻が広く使用されていますが、一度、タイムゾーンをまたいで日付と時刻の処理になると、ほとんどの人は常にまだ正しく日付と時刻を扱う方法を理解していないので、今日まとめします。...

Sep 1, 2018 · 7 min. read
シェア


プログラム内の日付と時刻は広く使用されていますが、一度タイムゾーンを越えて日付と時刻の処理に関与して、ほとんどの人は常にまだ正しく日付と時刻を扱う方法を理解していない、今日はまとめ。

共通の概念

GMTとUT時間

グリニッジ標準時(GMT)は、イギリスのロンドン郊外にある王立グリニッジ天文台で、そこを通る子午線が本初子午線と定義されているため、現地の平らな太陽時です。

UTとGMTは、どちらも天体観測に基づく同じ時刻標準です。UTは同じ標準の「科学的」名称であり、GMT:グリニッジ標準時は標準の「市民的」名称です。したがって、グリニッジ標準時と協定世界時は等価です。

地球の1日の自転はやや不規則で、徐々に遅くなっているため、グリニッジ標準時は天体観測の本質的な欠点に基づき、原子時計によって時を刻む協定世界時(Coordinated Universal Time)に取って代わられました。

協定世界時

協定世界時(UTC)は、原子時計の秒長に基づく世界標準時です。UTCは、原子時計の秒長を基準とする世界標準の時刻です。

ほとんどの目的では、UTC時間はGMT時間と互換性があると考えられていますが、GMT時間はもはや科学界では確立されていません。

タイムゾーン

タイムゾーンの概念は1863年に初めて導入され、地域ごとに標準時を設定し、ある場所の現地時間は通常、その場所が位置するタイムゾーンの標準時を指します。ある場所の現地時間は通常、その場所が位置するタイムゾーンの標準時を指します。子午線を15で割ったものを中心に東西に7.5度、つまり15度ごとに区切られたタイムゾーンが理論上のタイムゾーンです。ただし、国境を避けるため、不規則な形状のタイムゾーンもあり、大きな国では国内の行政境界線をタイムゾーンの境界線としています。これが実際のタイムゾーン、つまり法定タイムゾーンです。

タイムゾーンの表現

  • 時刻がゼロタイムゾーンにあり、たまたまUTCと同じである場合は、時刻の最後に大文字のZを付けます。 ZはUTCに対する時刻0のオフセットの指定で、例えば午後2時30分と5秒の場合は14:30:05ZまたはZ、時間と分だけの場合は1430Zまたは14:30Z、時間だけの場合は14Zまたは14Zと表現します。
  • その他のタイムゾーンは、実際の時刻に時差を加えたもので、UTC+9の場合は:30:05+09:または+、または223005+08と簡略化して表現します。
  • 例えば、2004年5月3日の東京時間午後5時30分8秒を示すには、-05-03T17:30:08+09:またはT173009+と表記します。

うるう秒:国際度量衡局(BIPM)が指定するUTC時刻にUTCを近づけるために、年末または年央にUTCを1調整することで、オペレーティング・システムによって処理されるため、プログラマーにはほとんど影響はないはずです。

DST:デイライト・セービング・タイム(夏時間)は 、Daylight Saving TimeまたはDaylight Saving Timeとも呼ばれ、エネルギーを節約するために現地の時間を人工的に設定するシステムです。一般に、夜明けが早くなる夏場に、人工的に時刻を1時間早めることで、早起き・早寝を可能にし、照明の量を減らして光源をフル活用することで、照明にかかる電力を節約するもの。サマータイムを採用している国によって具体的な規定は異なりますが、現在、アメリカ、EUなど世界110カ国近くが毎年サマータイムを実施しなければならず、日本もかつてサマータイムを実施していましたが、現在は実施されていません。

プログラマーが使用する時間

オペレーティングシステム

Unix時間

Unix時間は、Posix時間とも呼ばれ、UNIXタイムスタンプは、プログラムで最も一般的に使用され、1970年1月1日0:0:0 UTCからの総秒数を指します。これはUnixやUnixライクなシステムで使われる表現で、タイムゾーンとは無関係であることが特徴です。そのため、世界共通の時間オフセット指標として使用することができ、タイムスタンプは各タイムゾーンのローカル時間を計算するために使用することができます。日付+%sでUnix時間を見ることができます。

1901年12月13日20時45分52秒から2038年1月19日3時14分07秒までです。 Y2K 問題と同様に、32ビットのUnix/Linuxシステムは2038年に故障する可能性があるため、2038年問題とも呼ばれています。

タイムゾーン情報データベース

よく「Asia/Tokyo」というタイムゾーンを見かけますが、この情報はタイムゾーン情報データベースに格納されています:

export DEBIAN_FRONTEND=noninteractive && apt-get install -y tzdata

ハードウェアクロック

RTC または CMOS クロックとも呼ばれるハードウェアクロックは BIOS に保存され、マザーボードのバッテリーから電力を供給されて動作しています。 システムの電源が入ると読み込まれ、システム時刻はそれに従って設定されます。保存できるのは年、月、日、時、分、秒のみで、現在のタイムゾーンやサマータイム調整の有無は保存できません。そのため、BIOS時刻、つまりハードウェア時刻にはタイムゾーンがありません。

システム時計

Linuxカーネルでは、それはUTC時間で1970年1月1日からの経過秒数として保存されます。ハードウェアクロックは起動時に読み込まれ、/etc/adjtimeの設定に従って現在の時計が計算されます。起動後、システムクロックはハードウェアクロックとは独立して動作し、Linuxはクロック割り込みをカウントすることでシステムクロックを維持します。一般的には、dateコマンドを実行したときに表示される時刻で、linuxのすべての時刻呼び出しに使用されます。

/etc/localtime

このファイルは通常、/usr/share/zoneinfo/ディレクトリにあるタイムゾーンに対応するバイナリファイルへのソフトリンクです。日付や時刻を取得する他のツールは、この設定を考慮に入れます。多くの人はこのファイルを直接コピーしますが、それはお勧めできません。すべてのLinuxシステムはこのファイルに依存しています。

ln - s / usr / share / zoneinfo / Asia / Tokyo / etc / localtime.

/etc/timezone

このファイルには通常、タイムゾーンの直接テキスト表現、または時間オフセットが記録されます。例えば、タイムゾーンがAsia / Tokyo;に設定されている場合、このファイルの内容はAsia/ Tokyo;になります。このファイルはすべてのLinuxにあるわけではありません。このファイルは一般的に単純な表示です。

tip:localtimeファイルとtimezoneファイルの違いは?

プログラムとデータベースにおいて

データの保存と表示を分離する」という設計原則に基づき、絶対時刻のタイムスタンプをデータベースに保存し、表示時にユーザーが設定したタイムゾーンに従って正しい文字列にフォーマットするだけです。

Read next

UbuntuはShadowSocksサービスを構築します。

Ladder@Ubuntu Build ShadowSocks Service スクリプトを使用して Ubuntu サーバーに ShadowSocks サービスをインストールします。\nhttps://teddysun.com/342.html から\nインストール インストールスクリプトをダウンロード wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh スクリプトの実行パーミッションを変更します。chmod +x shadowsocks.sh 実行 ./shadowsocks.sh 2>&1 | tee shadowsocks.log設定の追加 実行プロセスでは、ポート、パスワード、暗号化アルゴリズムおよびその他の設定を設定するように求められますが、独自の選択肢のニーズに応じてすることができます、8899のデフォルトポートは、暗号化アルゴリズムは、ほとんどのデバイスの使用に適したaes - 256 - cfbから選択することができますおめでとうございます、Shadowsocks-pythonShadowsocks-pythonサーバーのインストールが完了しました! サーバーIP : 127.0.0.1 サーバーポート : 8899 パスワード : password 暗号化方式: aes- 256-cfb256-cfb ようこそ:https://teddysun.com/342.html お楽しみください! インストールは完了です。あとはクライアント端末に設定を追加するだけです。\n設定は/etc/shadowsocks.jsonで変更できます。\nマルチアカウント、マルチポートの設定は、/etc/shadowsocks.jsonの設定ファイルを変更します。\n{ "server": "0.0.0.0", "local_address": "127.0.0.1", "local_port":1080, "port_password":{ "8989": "password0", "9001": "password1", "9002": "password2", "9003": "password3", "9004": "password4" }, "timeout":300, "method": "your_encryption_method", "fast_open": false } uninstall .

Jun 30, 2018 · 2 min read