$ mol_time-日付と時刻を正しく操作する

こんにちは、私の名前はドミトリーカルロフスキーです。 洗練されたインターフェイスの複雑さを簡単に理解できるのは年ではありません。 私は比較的単純なものが欲しいのですが、最も単純なプログラムをかろうじて書くことができる障害者のように感じないほど強力です。



いずれのアプリケーションでも、遅かれ早かれ、時間を操作する必要があります。解析、何らかの方法での修正、何かの計算、シリアル化です。 日付と時刻は、太陽、月、地球の周期に同時に適応する非常に複雑なものです。 さらに、1年では1日の日数と時間数が異なる場合があり、1分であっても常に60秒であるとは限りません 。 このため、時間をかけて作業を行うには、プログラマーがより注意する必要があり、とにかくバグが非常に長い間ポップアップします。



いいえ、私は年をミリ秒として数えません-すぐに私の年齢は数十億秒になります。 何かもっと高いレベルを活用する時が来ました。 私たちの祖先がISO8601標準と呼んだものですが、多くの人はまだそれが何であり、どの場所を使用する価値があるのか​​を知りません。



次に、市のミニバンをスポーツバイクに変更することで、hemoを取り除く方法を学びます:-)



JSエンジンには、時間を扱うための標準APIである日付があります。 その名前を誤解させないでください。日付オブジェクトは日付ではなく、UNIX時代の初めからミリ秒単位で測定されるほとんどのタイムスタンプ(モーメント)です。 このAPIは、時間コンポーネント(年、月、日、時間、分、秒)から対応する曜日まで、さまざまな情報を一瞬取得できるオブジェクトインターフェイスを提供します。 残念ながら、この情報は現地時間またはUTCで利用できます。 他のタイムゾーンが必要な場合、悪いニュースがあります-日付は「2015-07-20T00:22:32 + 01:00」という形式のiso8601行のみを解析し、タイムスタンプを取得してタイムゾーンを忘れることができます悪夢について。 まあ、彼と地獄に、いくつかのニュアンスがなければ:



1.タイムゾーンが重要になる場合があります。 たとえば、クライアントが朝、夕方、昨日、明日となる時間を把握する必要があるサーバーアプリケーションを作成する場合などです。 つまり、どのタイムゾーンでも完全に機能する能力が必要です。



2.タイムゾーンが邪魔になる場合があります。 たとえば、カレンダーを作成し、時間に関係なく日付を操作すると、タイムゾーンの介入によって血統が簡単に損なわれる可能性があります 。 つまり、これらの時間の構成要素や必要でない場合は、他の時間の構成要素を示さない機能が必要です。



ISO8601では、「2015-07-20」と記述した場合、これはどのタイムゾーンでも7月20日です。 それにもかかわらず、異なる時間帯でのこの日の始まりと終わりの瞬間は異なります。 「新しい日付( '2015-07-20')」を使用すると、UTCでこの日付の開始のタイムスタンプ「2015-07-20T00:00:00.000Z」が得られ、一見同等のコード「new日付(2015、06、20)「その後、結果は既に」2015-07-19T21:00:00.000Z "。 日付はjavascriptのすべてのapiのように自発的に開発されたので、同じことを行うためのそのような多様性多くの方法に驚かないでください



人気のあるMomentJSライブラリ 、面倒なインターフェイスの問題を解決しようとしていますが、使用しないメソッドの数は2倍になっています。 いいえ、まあ、本当に、なぜ冷静な心と健康な記憶の誰かが「./Date(1198908717056-0700)/」 形式のASP.NET JSON Dateを使用するのでしょうか? そして、ネイティブDateには存在しない多くの必要なものを実装しているという事実にもかかわらず、「タイムスタンプ」の抽象化のみを提供するネイティブAPIの単なるラッパーであるため、同じ出生時のトラウマがあります。 したがって、「moment( '2015-07-20')」は、「2015-07-19T21:00:00.000Z」というラベルを返し、これに起因するすべての問題を示します。



両方のAPIに特徴的な別の出生時傷害は、オブジェクトの可変性です。 オブジェクトを何らかの方法で変更する場合は、それを複製することを忘れてはなりません。さもないと、アプリケーションの反対側のどこかで突然すべてが壊れる可能性があります。



しかし、最も悲しいことは、プラグインなしのMomentJSの重量が100キロバイトであり、同時に、 50倍の加速にもかかわらず、 光速近い双子のように減速することです



if (0 < m.year() && m.year() <= 9999) { if ('function' === typeof Date.prototype.toISOString) { // native implementation is ~50x faster, use it when we can return this.toDate().toISOString(); } else { return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); } } else { return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); }
      
      





さて、あなたは背中のすぐ下で熱感を感じますか? その後、治療に進みます。



まず、データを内部に保存する方法を決定する必要があります。 日付は時間の有無にかかわらず表示できます。 時間はオフセットの有無にかかわらず表示できます。 日付と時刻の両方を、完全な形式と切り捨てられた形式(たとえば、年-月、または時間-分)の両方で示すことができます。 つまり、その値が意味をなさない場合、時間の要素は存在しない可能性があります。 「2015年7月」をエンコードするには、2つのコンポーネント(年、月、その他)のみが必要です。 つまり、コンポーネントを別々のフィールドに格納することは理にかなっています。これにより、メモリ消費がわずかに増加しますが、一方で、速度には有益な効果があります。



次に、 iso8601形式を適切に理解する価値があります 。 結局のところ、多くのものがすでに提供されている良い基準がある場合、車輪を再発明する必要はありません。 特に、さまざまな精度(ミリ秒から年)、さまざまな測定単位での時間(秒から年)、さまざまな形式での時間間隔(開始-終了、開始-継続、終了-継続)、および間隔を繰り返しても(ただし、残念ながらほとんど使用されません)。



これで、名前に対応するオブジェクトを作成する3つの関数$ mol_time_momentを提供する$ mol_timeライブラリを作成する準備ができました。 $ mol_time_duration、interval これらはそれぞれ、iso8601文字列または{component_name:component_value}の形式の設定オブジェクトとして、さまざまなJSON表現で構築するためのパラメーターを受け入れることができます。 さらに、ネイティブDateオブジェクトとタイムスタンプからモーメントを作成し、ミリ秒数から期間を作成できます。



例として、私がすでに何歳かを数えてみましょう。



 Math.floor( new $mol_time_interval( '1984-08-04/' ).duration.count( 'P1Y' ) )
      
      







タスクを複雑にしましょう。10億秒になると、何曜日になりますか?



 new $mol_time_moment( '1984-08-04' ).shift({ second : 1e9 }).toString( 'WeekDay' )
      
      





日本では今何時ですか?



 new $mol_time_moment().toOffset( '+09:00' ).toString( 'hh:mm' )
      
      





そして、今月のすべての曜日を順番に印刷しましょう。



 let current = new $mol_time_moment().merge({ day : 0 , hour : 0 , minute : 0 , second : 0 }) const end = current.shift( 'P1M' ) while( current < end ) { console.log( current.toString( 'DD - WD' ).toLowerCase() ) current = current.shift( 'P1D' ) }
      
      





さらに、おそらく$ mol_timeドキュメントを残し、このライブラリを使用し始めて以来、白髪が私の頭の上でかなり減少し、その上の皮膚が滑らかで絹のようになり、 hemoがないため、厳しい批判を楽しみにしています人生は少し退屈になりました:-)



All Articles