ホームページ  >  記事  >  ウェブフロントエンド  >  JS 日付処理に fecha を使用する

JS 日付処理に fecha を使用する

高洛峰
高洛峰オリジナル
2016-12-06 11:12:451594ブラウズ

前書き

現在、私たちはプロジェクトの日付処理に fecha を使用しており、プロジェクトの実際のニーズを満たすために fecha を再パッケージしました。

fecha の紹介

fecha は、日付の書式設定と解析のための JS ライブラリであり、強力な日付処理関数を提供し、サイズはわずか 2K です。インストール方法は簡単で、 npm install fecha --save するだけです

フォーマット(日付のフォーマット)

fechaはフォーマットメソッドを提供します。 fecha.format は、Date オブジェクト (またはタイムスタンプ) と日付形式を文字列として受け取り、文字列 (処理された日付) を返します。

注: 受信パラメータが無効な場合、fecha はエラーを報告します

fecha.format(<Date Object>, <String Format>);
 
// 自定义格式化
// string format可以传入自定义的格式,fecha会返回相应的格式
fecha.format(new Date(2015, 10, 20), &#39;dddd MMMM Do, YYYY&#39;); // &#39;Friday November 20th, 2015&#39;
fecha.format(new Date(1998, 5, 3, 15, 23, 10, 350), &#39;YYYY-MM-DD hh:mm:ss.SSS A&#39;);// &#39;1998-06-03 03:23:10.350 PM&#39;
 
// 通过自定义的常量来设置日期格式
fecha.format(new Date(2015, 10, 20), &#39;mediumDate&#39;);// &#39;Nov 20, 2015&#39;
fecha.format(new Date(2015, 2, 10, 5, 30, 20), &#39;shortTime&#39;);// &#39;05:30&#39;
 
// 添加一些其他常量
fecha.format(new Date(2001, 2, 5, 6, 7, 2, 5), &#39;[on] MM-DD-YYYY [at] HH:mm&#39;); // &#39;on 03-05-2001 at 06:07&#39;

この方法で new Date() → 2016 年 11 月 19 日のようなニーズを簡単に処理できます

fecha.format(new Date(), &#39;YYYY[年]MM[月]DD[日]&#39;)

Parsing(date parsing)

fecha は parse メソッドも提供します。 format と同様に、fecha.parse は Date 文字列と文字列形式の日付形式を受け取り、Date オブジェクトを返します。

注: 渡されたパラメーターが無効な場合、fecha はエラーを報告します

// 自定义格式化
formatsfecha.parse(&#39;February 3rd, 2014&#39;, &#39;MMMM Do, YYYY&#39;); // new Date(2014, 1, 3)
fecha.parse(&#39;10-12-10 14:11:12&#39;, &#39;YY-MM-DD HH:mm:ss&#39;); // new Date(2010, 11, 10, 14, 11, 12)
 
// 通过自定义的常量来设置日期格式
 
fecha.parse(&#39;5/3/98&#39;, &#39;shortDate&#39;); // new Date(1998, 4, 3)
fecha.parse(&#39;November 4, 2005&#39;, &#39;longDate&#39;); // new Date(2005, 10, 4)

カスタム名前付き定数

fecha.masks = {
 &#39;default&#39;: &#39;ddd MMM DD YYYY&#39;,
 shortDate: &#39;M/D/YY&#39;,
 mediumDate: &#39;MMM D, YYYY&#39;,
 longDate: &#39;MMMM D, YYYY&#39;,
 fullDate: &#39;dddd, MMMM D, YYYY&#39;,
 shortTime: &#39;HH:mm&#39;,
 mediumTime: &#39;HH:mm:ss&#39;,
 longTime: &#39;HH:mm:ss.SSS&#39;
};

国際化サポート (拡張)

実際の使用では、次のような問題が発生します。 「月曜日」「火曜日」「月曜日」を設定する、または月曜日を「日曜日」に設定する必要がある、火曜日を「日曜日」に設定する必要があるなどの奇妙なニーズなど、非常にローカルなニーズです。これらのニーズはすべて、解析およびフォーマットのメソッドで説明されている i18n サポートを通じて実現できます。

fecha.i18n の対応する設定を変更するだけです。

fecha.i18n = {
 dayNamesShort: [&#39;周日&#39;, &#39;周一&#39;, &#39;周二&#39;, &#39;周三&#39;, &#39;周四&#39;, &#39;周五&#39;, &#39;周六&#39;],
 dayNames: [&#39;星期日&#39;, &#39;星期一&#39;, &#39;星期二&#39;, &#39;星期三&#39;, &#39;星期四&#39;, &#39;星期五&#39;, &#39;星期六&#39;],
 monthNamesShort: [&#39;01&#39;, &#39;02&#39;, &#39;03&#39;, &#39;04&#39;, &#39;05&#39;, &#39;06&#39;, &#39;07&#39;, &#39;08&#39;, &#39;09&#39;, &#39;10&#39;, &#39;11&#39;, &#39;12&#39;],
 monthNames: [&#39;一月&#39;, &#39;二月&#39;, &#39;三月&#39;, &#39;四月&#39;, &#39;五月&#39;, &#39;六月&#39;, &#39;七月&#39;, &#39;八月&#39;, &#39;九月&#39;, &#39;十月&#39;, &#39;十一月&#39;, &#39;十二月&#39;],
 amPm: [&#39;上午&#39;, &#39;下午&#39;],
 // D is the day of the month, function returns something like... 3rd or 11th
 DoFn: function (D) {
  return D + [ &#39;th&#39;, &#39;st&#39;, &#39;nd&#39;, &#39;rd&#39; ][ D % 10 > 3 ? 0 : (D - D % 10 !== 10) * D % 10 ];
 }
}

トークンのフォーマット

JS 日付処理に fecha を使用する fechaの再カプセル化


実際のニーズでは、さまざまな面倒な要件も発生します

2016-11-20 → 明天 11-20
2016-11-23 → 下周三 11-23
10:00 加上100分钟的时间
...

fechaはいくつかの機能を提供します素晴らしい実用的な日付処理方法しかし、あらゆる種類の奇妙なニーズの下では、実際のニーズを満たすために fecha を再カプセル化する必要があります。さらに、fecha をカプセル化してパブリック コンポーネントに抽出することにより、複数の i18n 構成と複数のページでのマスク設定を回避します。ページを呼び出すのも便利です。

カプセル化された fecha パブリック コンポーネントの例

import fecha from 'fecha'
 
fecha.i18n = {
 dayNamesShort: [&#39;周日&#39;, &#39;周一&#39;, &#39;周二&#39;, &#39;周三&#39;, &#39;周四&#39;, &#39;周五&#39;, &#39;周六&#39;],
 dayNames: [&#39;星期日&#39;, &#39;星期一&#39;, &#39;星期二&#39;, &#39;星期三&#39;, &#39;星期四&#39;, &#39;星期五&#39;, &#39;星期六&#39;],
 monthNamesShort: [&#39;01&#39;, &#39;02&#39;, &#39;03&#39;, &#39;04&#39;, &#39;05&#39;, &#39;06&#39;, &#39;07&#39;, &#39;08&#39;, &#39;09&#39;, &#39;10&#39;, &#39;11&#39;, &#39;12&#39;],
 monthNames: [&#39;一月&#39;, &#39;二月&#39;, &#39;三月&#39;, &#39;四月&#39;, &#39;五月&#39;, &#39;六月&#39;, &#39;七月&#39;, &#39;八月&#39;, &#39;九月&#39;, &#39;十月&#39;, &#39;十一月&#39;, &#39;十二月&#39;],
 amPm: [&#39;上午&#39;, &#39;下午&#39;],
 // D is the day of the month, function returns something like... 3rd or 11th
 DoFn: function (D) {
  return D + [ &#39;th&#39;, &#39;st&#39;, &#39;nd&#39;, &#39;rd&#39; ][ D % 10 > 3 ? 0 : (D - D % 10 !== 10) * D % 10 ];
 }
}
 
fecha.masks = {
 &#39;default&#39;: &#39;ddd MMM DD YYYY&#39;,
 shortDate: &#39;M/D/YY&#39;,
 mediumDate: &#39;MMM D, YYYY&#39;,
 longDate: &#39;MMMM D, YYYY&#39;,
 fullDate: &#39;dddd, MMMM D, YYYY&#39;,
 shortTime: &#39;HH:mm&#39;,
 mediumTime: &#39;HH:mm:ss&#39;,
 longTime: &#39;HH:mm:ss.SSS&#39;
};
// str 必须是 YYYYMMDD格式
// YYYYMMDD → xx(今天/后天/下周一...)MM月DD日
fecha.getDateString = (str, format) => {
 let now = Date.now();
 let today = fecha.format.bind(null, new Date());
 let tomorrow = fecha.format.bind(null, new Date(now + 86400 * 1000));
 let dayafter = fecha.format.bind(null, new Date(now + 86400 * 2 * 1000));
 
 let week_start = parseInt(today('d'));
 
 let result = {};
 // 从本周一到下周日共14个
 let weeks = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
 result[today(YYYYMMDD)] = `今天 ${today('MM')}月${today('DD')}日`;
 result[tomorrow(YYYYMMDD)] = `明天 ${tomorrow('MM')}月${tomorrow('DD')}日`;
 result[dayafter(YYYYMMDD)] = `后天 ${dayafter('MM')}月${dayafter('DD')}日`;
 
 weeks.slice(week_start + 3).forEach((after) => {
  let step = after - week_start;
  let _dayafter = fecha.format.bind(null, new Date(now + 86400 * step * 1000));
  result[_dayafter(YYYYMMDD)] = `${(after < 8 ? '本' : '下')}${_dayafter('ddd')} ${_dayafter('MM')}-${_dayafter('DD')}`;
 })
 // 如果出现下下周一的情况则输出调用时传入的格式规范
 return result || format(fecha.parse(str, YYYYMMDD), format)
}
 
export default fecha

他のページで日付処理を使用する必要がある場合、そのページで fecha コンポーネントを呼び出すだけで済みます。

import DateParser from &#39;fecha&#39;
 
...
 let date = DateParser.getDateString(&#39;20161123&#39;, &#39;YYYY-MM-DD&#39;)
...

既存の日付処理では実際のニーズを解決できない場合は、fecha コンポーネントにメソッドを自分で追加するだけで済みます。コメントを書き込んだ後、同僚が同じ機能を開発するときにコメントを直接呼び出すことができるため、チームの効率が向上します。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。