1/* 2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import { MILLISECOND } from '../constants/Constant' 17import StringUtil from './StringUtil' 18import { getResourceString } from './Tools' 19import Logger from '../../base/log/Logger' 20import LanguageUtil from './LanguageUtil' 21 22const TAG = 'DateTimeUtil' 23 24namespace DateTimeUtil { 25/** 26 * 日期格式常量 27 */ 28 export const DATE_FORMAT = { 29 YYYY_MM_DD: 'yyyy/mm/dd', 30 MM_DD: 'mm/dd', 31 DATE_TIME: 'yyyy/mm/dd HH:MM:SS', 32 YYYY_MM_DD_CHINESE: 'yyyy年mm月dd日', 33 MM_DD_CHINESE: 'm月d日', 34 DATE_TIME_CHINESE: 'yyyy年mm月dd日 HH:MM' 35 } 36 /** 37 * @description 获取指定时间戳当天0点的时间戳 38 * @param timeStamp 指定时间戳 39 * @return 当天0点的时间戳 40 */ 41 export function getDayBeginTimeStamp(timeStamp: number) { 42 const date = new Date(timeStamp) 43 const year = date.getFullYear() 44 const month = date.getMonth() + 1 45 const day = date.getDate() 46 47 return new Date(`${year}-${month}-${day}`).getTime() 48 } 49 50 /** 51 * @description 将时长转化成转化为时分秒 52 * @param duration 时长 53 * @param unit 时间单位 54 * @return 格式化时长,如:08:20 55 */ 56 export function formatDuration(duration: number): string { 57 let remainTime = duration 58 const hours = Math.floor(remainTime / MILLISECOND.ONE_HOUR) 59 remainTime -= hours * MILLISECOND.ONE_HOUR 60 const minutes = Math.floor(remainTime / MILLISECOND.ONE_MINUTE) 61 remainTime -= minutes * MILLISECOND.ONE_MINUTE 62 const seconds = Math.floor(remainTime / MILLISECOND.ONE_SECOND) 63 64 const minutesStr = StringUtil.padStart(minutes) 65 const secondsStr = StringUtil.padStart(seconds) 66 if (hours) { 67 const hoursStr = StringUtil.padStart(hours) 68 return `${hoursStr}:${minutesStr}:${secondsStr}` 69 } else { 70 return `${minutesStr}:${secondsStr}` 71 } 72 } 73 74 /** 75 * @description 格式化文件更新时间 76 * @param timeStamp 时间戳,单位毫秒 77 * @param 格式化时间,如:YYYY/MM/HH hh:mm:ss 78 */ 79 export function formatFileModifiedTime(timeStamp: number): string { 80 const dateTime = new Date(timeStamp) 81 const year = dateTime.getFullYear() 82 const month = StringUtil.padStart(dateTime.getMonth() + 1) 83 const day = StringUtil.padStart(dateTime.getDate()) 84 const hour = StringUtil.padStart(dateTime.getHours()) 85 const minute = StringUtil.padStart(dateTime.getMinutes()) 86 const second = StringUtil.padStart(dateTime.getSeconds()) 87 return `${year}/${month}/${day} ${hour}:${minute}:${second}` 88 } 89 90 /** 91 * 日期格式转换 92 * @param timestamp 时间戳 93 * @param format 格式(可选) 94 * @example formatDate(new Date(), "YYYY-mm-dd HH:MM:SS") => 2021-11-02 09:39:59 95 */ 96 export function formatDate(timestamp, format = DATE_FORMAT.YYYY_MM_DD) { 97 let res = "" 98 try { 99 const date = new Date(timestamp) 100 const opt = { 101 "y+": date.getFullYear().toString(), // 年 102 "m+": (date.getMonth() + 1).toString(), // 月 103 "d+": date.getDate().toString(), // 日 104 "H+": date.getHours().toString(), // 时 105 "M+": date.getMinutes().toString(), // 分 106 "S+": date.getSeconds().toString(), // 秒 107 } 108 for (let key in opt) { 109 const reg = new RegExp(key) 110 let ret = reg.exec(format) 111 if (ret) { 112 format = format.replace( 113 reg, ret[0].length == 1 ? opt[key] : opt[key].padStart(ret[0].length, "0") 114 ) 115 } 116 } 117 res = format 118 } catch (error) { 119 Logger.e(TAG, 'formatDate error: ' + error.toString()) 120 } 121 return res 122 } 123 124 /** 125 * @description 获取YYYY/MM/DD格式的日期 126 * @param timeStamp 时间戳,单位毫秒 127 * @return 格式化时间,格式:中文显示“2022/10/08”,其他显示“08/10/2022” 128 */ 129 export function getSimpleDateString(timeStamp: number, format: string = ''): string { 130 return formatDate(timeStamp, format || DATE_FORMAT.YYYY_MM_DD) 131 } 132 133 /** 134 * @description 格式化时间 135 * @param timeStamp 时间戳,单位毫秒 136 * @return 格式化时间,规则如下: 137 * 当前日期同一天:今天 138 * 当前日期前一天:昨天 139 * 其他:YYYY/MM/DD 140 */ 141 export function getDateStringForCategory(timeStamp: number): string { 142 const now = Date.now() 143 const current = getDayBeginTimeStamp(timeStamp) 144 const today = getDayBeginTimeStamp(now) 145 const yesterday = today - MILLISECOND.ONE_DAY 146 if (current === today) { 147 return getResourceString($r('app.string.today')) 148 } else if (current === yesterday) { 149 return getResourceString($r('app.string.yesterday')) 150 } else { 151 return getSimpleDateString(timeStamp) 152 } 153 } 154 155 /** 156 * @description 获取最近卡片显示的格式日期 157 * @param timeStamp 时间戳,单位毫秒 158 * @return 格式化时间,规则如下: 159 * 当前时间1分钟内:刚刚 160 * 当前时间1小时内:XX分钟前 161 * 当前日期同一天:上午 08:00 162 * 当前日期前一天:昨天 163 * 今年:MM月DD日 164 * 往年:YYYY/MM/DD 165 */ 166 export function getDateStringForRecentCard(timeStamp: number): Resource | string { 167 let dateString = undefined 168 const date = new Date() 169 const now = date.getTime() 170 const nowYear = date.getFullYear() 171 const cardYear = new Date(timeStamp).getFullYear() 172 const timeGap = now - timeStamp 173 const todayBegin = getDayBeginTimeStamp(now) 174 const yesterdayBegin = todayBegin - MILLISECOND.ONE_DAY 175 if (timeStamp > todayBegin) { 176 if (timeGap < MILLISECOND.ONE_MINUTE) { 177 dateString = $r('app.string.justNow') 178 } else if (timeGap < MILLISECOND.ONE_HOUR) { 179 const minute = Math.floor(timeGap / MILLISECOND.ONE_MINUTE) 180 dateString = $r('app.plural.minute_ago', minute, minute) 181 } else { 182 dateString = $r('app.string.today') 183 } 184 } else if (timeStamp > yesterdayBegin) { 185 dateString = $r('app.string.yesterday') 186 } else if (cardYear === nowYear) { 187 const format = LanguageUtil.isChineseLanguage() ? DATE_FORMAT.MM_DD_CHINESE : DATE_FORMAT.MM_DD 188 dateString = formatDate(timeStamp, format) 189 } else { 190 dateString = getSimpleDateString(timeStamp) 191 } 192 return dateString 193 } 194} 195 196export default DateTimeUtil 197