レッスンに戻る

相対日付をフォーマットする

重要性: 4

次のように date をフォーマットする関数 formatDate(date) を書いてください。:

  • もし date が1秒未満で渡された場合、"right now" です。
  • そうではなく、date が1分未満で渡された場合、"n sec. ago" です。
  • そうではなく、1時間未満の場合は "m min. ago" です。
  • そ例外の場合はフォーマット "DD.MM.YY HH:mm" の完全な日付です。つまり: "day.month.year hours:minutes", すべて2桁の形式です。e.g. 31.12.16 10:00

例:

alert( formatDate(new Date(new Date - 1)) ); // "right now"

alert( formatDate(new Date(new Date - 30 * 1000)) ); // "30 sec. ago"

alert( formatDate(new Date(new Date - 5 * 60 * 1000)) ); // "5 min. ago"

// yesterday's date like 31.12.2016, 20:00
alert( formatDate(new Date(new Date - 86400 * 1000)) );

テストと一緒にサンドボックスを開く

date から “今” までの 時間を取得するために – 日付を減算しましょう。

function formatDate(date) {
  let diff = new Date() - date; // ミリ秒での差

  if (diff < 1000) { // 1秒未満
    return 'right now';
  }

  let sec = Math.floor(diff / 1000); // 差分を秒に変換

  if (sec < 60) {
    return sec + ' sec. ago';
  }

  let min = Math.floor(diff / 60000); // 差分を分に変換
  if (min < 60) {
    return min + ' min. ago';
  }

  // 日付のフォーマット
  // 1桁の 日/月/時/分 に先頭のゼロを追加
  let d = date;
  d = [
    '0' + d.getDate(),
    '0' + (d.getMonth() + 1),
    '' + d.getFullYear(),
    '0' + d.getHours(),
    '0' + d.getMinutes()
  ].map(component => component.slice(-2)); // すべてのコンポーネントの最後の2桁を取る

  // コンポーネントを日付に連結
  return d.slice(0, 3).join('.') + ' ' + d.slice(3).join(':');
}

alert( formatDate(new Date(new Date - 1)) ); // "right now"

alert( formatDate(new Date(new Date - 30 * 1000)) ); // "30 sec. ago"

alert( formatDate(new Date(new Date - 5 * 60 * 1000)) ); // "5 min. ago"

// yesterday's date like 31.12.2016, 20:00
alert( formatDate(new Date(new Date - 86400 * 1000)) );
function formatDate(date) {
  let diff = new Date() - date; // the difference in milliseconds

  if (diff < 1000) { // less than 1 second
    return 'right now';
  }

  let sec = Math.floor(diff / 1000); // convert diff to seconds

  if (sec < 60) {
    return sec + ' sec. ago';
  }

  let min = Math.floor(diff / 60000); // convert diff to minutes
  if (min < 60) {
    return min + ' min. ago';
  }

  // format the date
  // add leading zeroes to single-digit day/month/hours/minutes
  let d = date;
  d = [
    '0' + d.getDate(),
    '0' + (d.getMonth() + 1),
    '' + d.getFullYear(),
    '0' + d.getHours(),
    '0' + d.getMinutes()
  ].map(component => component.slice(-2)); // take last 2 digits of every component

  // join the components into date
  return d.slice(0, 3).join('.') + ' ' + d.slice(3).join(':');
}

サンドボックスでテストと一緒に解答を開く