最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

TypeScript封裝一個(gè)通用的時(shí)間格式化方法

 更新時(shí)間:2025年02月14日 16:19:44   作者:江城開(kāi)朗的豌豆  
在日常開(kāi)發(fā)中,我們經(jīng)常需要將時(shí)間格式化為用戶友好的形式,本文將介紹如何在 TypeScript 中封裝一個(gè)通用的時(shí)間格式化方法,需要的可以了解下

在日常開(kāi)發(fā)中,我們經(jīng)常需要將時(shí)間格式化為用戶友好的形式,比如 PM 03:05。本文將介紹如何在 TypeScript 中封裝一個(gè)通用的時(shí)間格式化方法,支持多種輸入類型,并具備良好的擴(kuò)展性和錯(cuò)誤處理能力。

1. 核心實(shí)現(xiàn)代碼

以下是核心代碼實(shí)現(xiàn):

/**
 * 將時(shí)間格式化為 AM/PM 格式(例如 "PM 03:05")
 * @param input 時(shí)間輸入(支持 Date 對(duì)象、時(shí)間戳、ISO 字符串)
 * @returns 格式化后的時(shí)間字符串
 * @throws 當(dāng)輸入無(wú)效時(shí)拋出錯(cuò)誤
 */
function formatTimeToAMPM(input: Date | number | string): string {
  // 將輸入統(tǒng)一轉(zhuǎn)換為 Date 對(duì)象
  const date = input instanceof Date ? input : new Date(input);

  // 驗(yàn)證時(shí)間有效性
  if (isNaN(date.getTime())) {
    throw new Error("Invalid date input");
  }

  // 提取小時(shí)和分鐘
  let hours = date.getHours();
  const minutes = date.getMinutes().toString().padStart(2, "0");

  // 判斷 AM/PM
  const ampm = hours >= 12 ? "PM" : "AM";
  
  // 轉(zhuǎn)換為 12 小時(shí)制
  hours = hours % 12;
  hours = hours === 0 ? 12 : hours; // 處理 0 點(diǎn)顯示為 12

  // 格式化為兩位數(shù)小時(shí)
  const formattedHours = hours.toString().padStart(2, "0");

  return `${ampm} ${formattedHours}:${minutes}`;
}

2. 功能特性

  • 多類型輸入支持:接受 Date 對(duì)象、時(shí)間戳(number)、ISO 字符串(string)。
  • 錯(cuò)誤處理:無(wú)效輸入會(huì)拋出明確錯(cuò)誤。
  • 自動(dòng)補(bǔ)零:小時(shí)和分鐘始終顯示兩位數(shù)(如 03:05)。
  • 12 小時(shí)制:自動(dòng)轉(zhuǎn)換 24 小時(shí)制為 12 小時(shí)制(0 點(diǎn)顯示為 12)。

3. 使用示例

// 示例 1: 使用 Date 對(duì)象
const now = new Date("2023-10-10T15:05:00"); // 3:05 PM
console.log(formatTimeToAMPM(now)); // 輸出 "PM 03:05"

// 示例 2: 使用時(shí)間戳
const timestamp = now.getTime();
console.log(formatTimeToAMPM(timestamp)); // 輸出 "PM 03:05"

// 示例 3: 使用 ISO 字符串
console.log(formatTimeToAMPM("2023-10-10T00:05:00")); // 輸出 "AM 12:05"
console.log(formatTimeToAMPM("2023-10-10T12:05:00")); // 輸出 "PM 12:05"
console.log(formatTimeToAMPM("2023-10-10T13:05:00")); // 輸出 "PM 01:05"

4. 高級(jí)用法(擴(kuò)展功能)

支持自定義格式

interface FormatOptions {
  showSeconds?: boolean;   // 是否顯示秒(如 "PM 03:05:30")
  uppercase?: boolean;     // AM/PM 是否大寫(xiě)(默認(rèn) true)
}

function formatTimeToAMPM(
  input: Date | number | string,
  options: FormatOptions = {}
): string {
  // ...(省略前面的代碼)

  // 處理選項(xiàng)
  const ampmDisplay = options.uppercase !== false ? ampm : ampm.toLowerCase();
  let result = `${ampmDisplay} ${formattedHours}:${minutes}`;

  // 添加秒數(shù)
  if (options.showSeconds) {
    const seconds = date.getSeconds().toString().padStart(2, "0");
    result += `:${seconds}`;
  }

  return result;
}

// 使用示例
console.log(formatTimeToAMPM(new Date(), { showSeconds: true }));
// 輸出 "PM 03:05:30"
console.log(formatTimeToAMPM(new Date(), { uppercase: false }));
// 輸出 "pm 03:05"

5. 關(guān)鍵邏輯解析

步驟代碼說(shuō)明
輸入轉(zhuǎn)換new Date(input)統(tǒng)一轉(zhuǎn)換為 Date 對(duì)象
有效性校驗(yàn)isNaN(date.getTime())確保輸入是合法時(shí)間
12 小時(shí)制轉(zhuǎn)換hours = hours % 12將 24 小時(shí)制轉(zhuǎn)換為 12 小時(shí)制
午夜 0 點(diǎn)處理hours = hours === 0 ? 12 : hours0 點(diǎn)顯示為 12(符合日常習(xí)慣)
自動(dòng)補(bǔ)零.padStart(2, "0")確保小時(shí)和分鐘始終是兩位數(shù)
AM/PM 判斷hours >= 12 ? "PM" : "AM"根據(jù)小時(shí)數(shù)判斷時(shí)段

6. 常見(jiàn)問(wèn)題解決

問(wèn)題 1:時(shí)區(qū)不一致

現(xiàn)象:輸出時(shí)間與預(yù)期不符。

解決:明確函數(shù)基于本地時(shí)間,如需 UTC 時(shí)間,改用以下方法:

// 使用 UTC 時(shí)間
let hours = date.getUTCHours();
const minutes = date.getUTCMinutes().toString().padStart(2, "0");

問(wèn)題 2:輸入解析失敗

  • 現(xiàn)象:傳入字符串如 "3:05 PM" 導(dǎo)致錯(cuò)誤。
  • 解決:使用更安全的解析庫(kù)(如 date-fns 或 moment.js)替代 new Date()。

問(wèn)題 3:瀏覽器兼容性

現(xiàn)象:舊瀏覽器不支持 .padStart()。

解決:添加 Polyfill 或改用以下代碼:

const padZero = (num: number) => (num < 10 ? `0${num}` : num.toString());
const minutes = padZero(date.getMinutes());

7. 總結(jié)

通過(guò)上述方法,我們實(shí)現(xiàn)了一個(gè)靈活且可靠的 TypeScript 時(shí)間格式化工具。它支持多種輸入類型,具備良好的擴(kuò)展性和錯(cuò)誤處理能力,能夠滿足日常開(kāi)發(fā)中的大部分需求。

到此這篇關(guān)于TypeScript封裝一個(gè)通用的時(shí)間格式化方法的文章就介紹到這了,更多相關(guān)TypeScript時(shí)間格式化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

佛坪县| 同德县| 新营市| 肥乡县| 东港市| 海原县| 方城县| 依兰县| 康马县| 枣庄市| 峨山| 永康市| 万全县| 江北区| 宁远县| 博湖县| 兰溪市| 汉川市| 策勒县| 日土县| 洪洞县| 台州市| 白城市| 盐城市| 霍邱县| 图们市| 克什克腾旗| 朝阳县| 顺平县| 尼勒克县| 辽阳市| 洛南县| 普宁市| 泉州市| 大同县| 三门县| 合阳县| 中牟县| 漠河县| 沐川县| 玉田县|