/* * Copyright (c) 2021-2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { MILLISECOND } from '../constants/Constant' import StringUtil from './StringUtil' import { getResourceString } from './Tools' import Logger from '../../base/log/Logger' import LanguageUtil from './LanguageUtil' const TAG = 'DateTimeUtil' namespace DateTimeUtil { /** * 日期格式常量 */ export const DATE_FORMAT = { YYYY_MM_DD: 'yyyy/mm/dd', MM_DD: 'mm/dd', DATE_TIME: 'yyyy/mm/dd HH:MM:SS', YYYY_MM_DD_CHINESE: 'yyyy年mm月dd日', MM_DD_CHINESE: 'm月d日', DATE_TIME_CHINESE: 'yyyy年mm月dd日 HH:MM' } /** * @description 获取指定时间戳当天0点的时间戳 * @param timeStamp 指定时间戳 * @return 当天0点的时间戳 */ export function getDayBeginTimeStamp(timeStamp: number) { const date = new Date(timeStamp) const year = date.getFullYear() const month = date.getMonth() + 1 const day = date.getDate() return new Date(`${year}-${month}-${day}`).getTime() } /** * @description 将时长转化成转化为时分秒 * @param duration 时长 * @param unit 时间单位 * @return 格式化时长,如:08:20 */ export function formatDuration(duration: number): string { let remainTime = duration const hours = Math.floor(remainTime / MILLISECOND.ONE_HOUR) remainTime -= hours * MILLISECOND.ONE_HOUR const minutes = Math.floor(remainTime / MILLISECOND.ONE_MINUTE) remainTime -= minutes * MILLISECOND.ONE_MINUTE const seconds = Math.floor(remainTime / MILLISECOND.ONE_SECOND) const minutesStr = StringUtil.padStart(minutes) const secondsStr = StringUtil.padStart(seconds) if (hours) { const hoursStr = StringUtil.padStart(hours) return `${hoursStr}:${minutesStr}:${secondsStr}` } else { return `${minutesStr}:${secondsStr}` } } /** * @description 格式化文件更新时间 * @param timeStamp 时间戳,单位毫秒 * @param 格式化时间,如:YYYY/MM/HH hh:mm:ss */ export function formatFileModifiedTime(timeStamp: number): string { const dateTime = new Date(timeStamp) const year = dateTime.getFullYear() const month = StringUtil.padStart(dateTime.getMonth() + 1) const day = StringUtil.padStart(dateTime.getDate()) const hour = StringUtil.padStart(dateTime.getHours()) const minute = StringUtil.padStart(dateTime.getMinutes()) const second = StringUtil.padStart(dateTime.getSeconds()) return `${year}/${month}/${day} ${hour}:${minute}:${second}` } /** * 日期格式转换 * @param timestamp 时间戳 * @param format 格式(可选) * @example formatDate(new Date(), "YYYY-mm-dd HH:MM:SS") => 2021-11-02 09:39:59 */ export function formatDate(timestamp, format = DATE_FORMAT.YYYY_MM_DD) { let res = "" try { const date = new Date(timestamp) const opt = { "y+": date.getFullYear().toString(), // 年 "m+": (date.getMonth() + 1).toString(), // 月 "d+": date.getDate().toString(), // 日 "H+": date.getHours().toString(), // 时 "M+": date.getMinutes().toString(), // 分 "S+": date.getSeconds().toString(), // 秒 } for (let key in opt) { const reg = new RegExp(key) let ret = reg.exec(format) if (ret) { format = format.replace( reg, ret[0].length == 1 ? opt[key] : opt[key].padStart(ret[0].length, "0") ) } } res = format } catch (error) { Logger.e(TAG, 'formatDate error: ' + error.toString()) } return res } /** * @description 获取YYYY/MM/DD格式的日期 * @param timeStamp 时间戳,单位毫秒 * @return 格式化时间,格式:中文显示“2022/10/08”,其他显示“08/10/2022” */ export function getSimpleDateString(timeStamp: number, format: string = ''): string { return formatDate(timeStamp, format || DATE_FORMAT.YYYY_MM_DD) } /** * @description 格式化时间 * @param timeStamp 时间戳,单位毫秒 * @return 格式化时间,规则如下: * 当前日期同一天:今天 * 当前日期前一天:昨天 * 其他:YYYY/MM/DD */ export function getDateStringForCategory(timeStamp: number): string { const now = Date.now() const current = getDayBeginTimeStamp(timeStamp) const today = getDayBeginTimeStamp(now) const yesterday = today - MILLISECOND.ONE_DAY if (current === today) { return getResourceString($r('app.string.today')) } else if (current === yesterday) { return getResourceString($r('app.string.yesterday')) } else { return getSimpleDateString(timeStamp) } } /** * @description 获取最近卡片显示的格式日期 * @param timeStamp 时间戳,单位毫秒 * @return 格式化时间,规则如下: * 当前时间1分钟内:刚刚 * 当前时间1小时内:XX分钟前 * 当前日期同一天:上午 08:00 * 当前日期前一天:昨天 * 今年:MM月DD日 * 往年:YYYY/MM/DD */ export function getDateStringForRecentCard(timeStamp: number): Resource | string { let dateString = undefined const date = new Date() const now = date.getTime() const nowYear = date.getFullYear() const cardYear = new Date(timeStamp).getFullYear() const timeGap = now - timeStamp const todayBegin = getDayBeginTimeStamp(now) const yesterdayBegin = todayBegin - MILLISECOND.ONE_DAY if (timeStamp > todayBegin) { if (timeGap < MILLISECOND.ONE_MINUTE) { dateString = $r('app.string.justNow') } else if (timeGap < MILLISECOND.ONE_HOUR) { const minute = Math.floor(timeGap / MILLISECOND.ONE_MINUTE) dateString = $r('app.plural.minute_ago', minute, minute) } else { dateString = $r('app.string.today') } } else if (timeStamp > yesterdayBegin) { dateString = $r('app.string.yesterday') } else if (cardYear === nowYear) { const format = LanguageUtil.isChineseLanguage() ? DATE_FORMAT.MM_DD_CHINESE : DATE_FORMAT.MM_DD dateString = formatDate(timeStamp, format) } else { dateString = getSimpleDateString(timeStamp) } return dateString } } export default DateTimeUtil