Android Kotlin使用扩展文件实现API返回日期字符串转Thu. 23 Sept 2021格式
嘿,这个需求提得很到位!用扩展文件统一处理日期格式化确实是个聪明的做法,既能保持代码简洁,后期维护也方便。我给你一步步拆解实现方案:
第一步:创建日期处理扩展文件
首先,在你的项目里新建一个专门的工具文件,比如 utils/date-extensions.js,用来封装所有日期格式化逻辑。这里我们用原生JavaScript实现,不需要额外依赖:
// utils/date-extensions.js // 定义目标格式需要的星期、月份缩写(注意Sept是9月的特殊缩写) const WEEKDAY_SHORT = ['Sun.', 'Mon.', 'Tue.', 'Wed.', 'Thu.', 'Fri.', 'Sat.']; const MONTH_SHORT = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec']; // 单个日期字符串转换函数 export function formatApiDate(dateStr) { const date = new Date(dateStr); // 先校验日期有效性,避免API返回脏数据导致报错 if (isNaN(date.getTime())) { console.warn(`无效的日期字符串:${dateStr}`); return 'Invalid Date'; } const weekday = WEEKDAY_SHORT[date.getDay()]; const day = date.getDate(); const month = MONTH_SHORT[date.getMonth()]; const year = date.getFullYear(); return `${weekday} ${day} ${month} ${year}`; } // 批量处理日期数组的辅助函数(如果API返回大量日期列表) export function formatApiDates(dateStrArray) { return dateStrArray.map(dateStr => formatApiDate(dateStr)); }
第二步:在项目中引入并使用这个扩展
接下来根据你的项目框架,选择全局引入或者按需导入:
全局引入(比如Vue/React项目)
如果是Vue项目,可以在 main.js 里把格式化函数挂载到全局:
// main.js import { formatApiDate } from './utils/date-extensions'; Vue.prototype.$formatDate = formatApiDate;
之后在任意组件里就能直接用:
<!-- 组件模板中 --> <span>{{ $formatDate(apiData.createdAt) }}</span>
如果是React项目,更推荐按需导入,但也可以通过Context全局共享:
// 组件文件中 import { formatApiDate, formatApiDates } from '../utils/date-extensions'; // 处理单个日期 const formattedSingleDate = formatApiDate(apiResponse.date); // 批量处理API返回的日期数组 const formattedDateList = formatApiDates(apiResponse.dateList);
按需导入(通用方案)
不管什么框架,直接在需要处理日期的文件里导入函数即可,这种方式更清晰,也利于Tree Shaking:
import { formatApiDate } from './utils/date-extensions'; const processedDate = formatApiDate(apiReturnedDateStr);
第三步:处理时区与特殊场景(可选但关键)
如果API返回的是UTC格式的日期(比如 2021-09-23T00:00:00Z),直接用上面的函数会转换为本地时区,可能导致日期偏移。如果需要保持UTC时间的显示,可以修改函数为UTC版本:
// 添加到date-extensions.js中 export function formatApiDateUTC(dateStr) { const date = new Date(dateStr); if (isNaN(date.getTime())) { console.warn(`无效的日期字符串:${dateStr}`); return 'Invalid Date'; } const weekday = WEEKDAY_SHORT[date.getUTCDay()]; const day = date.getUTCDate(); const month = MONTH_SHORT[date.getUTCMonth()]; const year = date.getUTCFullYear(); return `${weekday} ${day} ${month} ${year}`; }
另外,如果API返回的是非标准日期字符串(比如 2021/09/23 或者 09-23-2021),可以在函数里先做预处理:
// 处理非标准日期的示例 export function formatApiDate(dateStr) { // 把斜杠替换为横杠,兼容非标准格式 const standardizedStr = dateStr.replace(/\//g, '-'); const date = new Date(standardizedStr); // 后续逻辑不变... }
额外优化:基于日期库简化实现(如果项目已用)
如果你的项目已经引入了Day.js、Moment.js这类日期库,可以用它们来简化代码,同时避免原生Date的兼容性问题。以Day.js为例:
// utils/date-extensions.js import dayjs from 'dayjs'; import localeData from 'dayjs/plugin/localeData'; // 加载locale插件,自定义月份缩写 dayjs.extend(localeData); // 自定义本地化,把默认的Sep改成Sept const customLocale = { monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'] }; // 合并到Day.js的默认本地化中 dayjs.locale({ ...dayjs.locale(), ...customLocale }, null, true); export function formatApiDate(dateStr) { return dayjs(dateStr).format('ddd. DD MMM YYYY'); }
这样代码更简洁,而且Day.js的时区处理、日期解析能力更强,适合复杂场景。
内容的提问来源于stack exchange,提问作者Radin
相关产品推荐
相关产品推荐

