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 export interface DateFormat { 27 YYYY_MM_DD: string, 28 MM_DD: string, 29 DATE_TIME: string, 30 YYYY_MM_DD_CHINESE: string, 31 MM_DD_CHINESE: string, 32 DATE_TIME_CHINESE: string 33 } 34 35 /** 36 * 日期格式常量 37 */ 38 let DATE_FORMAT: DateFormat = { 39 YYYY_MM_DD: 'yyyy/mm/dd', 40 MM_DD: 'mm/dd', 41 DATE_TIME: 'yyyy/mm/dd HH:MM:SS', 42 YYYY_MM_DD_CHINESE: 'yyyy年mm月dd日', 43 MM_DD_CHINESE: 'm月d日', 44 DATE_TIME_CHINESE: 'yyyy年mm月dd日 HH:MM', 45 } 46 47 /** 48 * @description 获取指定时间戳当天0点的时间戳 49 * @param timeStamp 指定时间戳 50 * @return 当天0点的时间戳 51 */ 52 export function getDayBeginTimeStamp(timeStamp: number) { 53 const date = new Date(timeStamp); 54 const year = date.getFullYear(); 55 const month = date.getMonth() + 1; 56 const day = date.getDate(); 57 58 return new Date(`${year}-${month}-${day}`).getTime(); 59 } 60 61 /** 62 * @description 将时长转化成转化为时分秒 63 * @param duration 时长 64 * @param unit 时间单位 65 * @return 格式化时长,如:08:20 66 */ 67 export function formatDuration(duration: number): string { 68 let remainTime = duration; 69 const hours = Math.floor(remainTime / MILLISECOND.ONE_HOUR); 70 remainTime -= hours * MILLISECOND.ONE_HOUR; 71 const minutes = Math.floor(remainTime / MILLISECOND.ONE_MINUTE); 72 remainTime -= minutes * MILLISECOND.ONE_MINUTE; 73 const seconds = Math.floor(remainTime / MILLISECOND.ONE_SECOND); 74 75 const minutesStr = StringUtil.padStart(minutes); 76 const secondsStr = StringUtil.padStart(seconds); 77 if (hours) { 78 const hoursStr = StringUtil.padStart(hours); 79 return `${hoursStr}:${minutesStr}:${secondsStr}`; 80 } else { 81 return `${minutesStr}:${secondsStr}`; 82 } 83 } 84 85 /** 86 * @description 格式化文件更新时间 87 * @param timeStamp 时间戳,单位毫秒 88 * @param 格式化时间,如:YYYY/MM/HH hh:mm:ss 89 */ 90 export function formatFileModifiedTime(timeStamp: number): string { 91 const dateTime = new Date(timeStamp); 92 const year = dateTime.getFullYear(); 93 const month = StringUtil.padStart(dateTime.getMonth() + 1); 94 const day = StringUtil.padStart(dateTime.getDate()); 95 const hour = StringUtil.padStart(dateTime.getHours()); 96 const minute = StringUtil.padStart(dateTime.getMinutes()); 97 const second = StringUtil.padStart(dateTime.getSeconds()); 98 return `${year}/${month}/${day} ${hour}:${minute}:${second}`; 99 } 100 101 /** 102 * 日期格式转换 103 * @param timestamp 时间戳 104 * @param format 格式(可选) 105 * @example formatDate(new Date(), "YYYY-mm-dd HH:MM:SS") => 2021-11-02 09:39:59 106 */ 107 export function formatDate(timestamp: number, format:string = DATE_FORMAT.YYYY_MM_DD): string { 108 let res = ''; 109 try { 110 const date = new Date(timestamp); 111 const opt: Record<string, string> = { 112 'y+': date.getFullYear().toString(), // 年 113 'm+': (date.getMonth() + 1).toString(), // 月 114 'd+': date.getDate().toString(), // 日 115 'H+': date.getHours().toString(), // 时 116 'M+': date.getMinutes().toString(), // 分 117 'S+': date.getSeconds().toString(), // 秒 118 }; 119 Object.keys(opt).forEach((key) => { 120 const reg = new RegExp(key); 121 let ret = reg.exec(format); 122 if (ret) { 123 format = format.replace( 124 reg, ret[0].length == 1 ? opt[key] : opt[key].padStart(ret[0].length, '0') 125 ); 126 } 127 }); 128 res = format; 129 } catch (error) { 130 Logger.e(TAG, 'formatDate error: ' + error.toString()); 131 } 132 return res; 133 } 134 135 /** 136 * @description 获取YYYY/MM/DD格式的日期 137 * @param timeStamp 时间戳,单位毫秒 138 * @return 格式化时间,格式:中文显示“2022/10/08”,其他显示“08/10/2022” 139 */ 140 export function getSimpleDateString(timeStamp: number, format: string = ''): string { 141 return formatDate(timeStamp, format || DATE_FORMAT.YYYY_MM_DD); 142 } 143 144 /** 145 * @description 格式化时间 146 * @param timeStamp 时间戳,单位毫秒 147 * @return 格式化时间,规则如下: 148 * 当前日期同一天:今天 149 * 当前日期前一天:昨天 150 * 其他:YYYY/MM/DD 151 */ 152 export function getDateStringForCategory(timeStamp: number): string { 153 const now = Date.now(); 154 const current = getDayBeginTimeStamp(timeStamp); 155 const today = getDayBeginTimeStamp(now); 156 const yesterday = today - MILLISECOND.ONE_DAY; 157 if (current === today) { 158 return getResourceString($r('app.string.today')); 159 } else if (current === yesterday) { 160 return getResourceString($r('app.string.yesterday')); 161 } else { 162 return getSimpleDateString(timeStamp); 163 } 164 } 165 166 /** 167 * @description 获取最近卡片显示的格式日期 168 * @param timeStamp 时间戳,单位毫秒 169 * @return 格式化时间,规则如下: 170 * 当前时间1分钟内:刚刚 171 * 当前时间1小时内:XX分钟前 172 * 当前日期同一天:上午 08:00 173 * 当前日期前一天:昨天 174 * 今年:MM月DD日 175 * 往年:YYYY/MM/DD 176 */ 177 export function getDateStringForRecentCard(timeStamp: number): Resource | string { 178 let dateString : Resource | string; 179 const date = new Date(); 180 const now = date.getTime(); 181 const nowYear = date.getFullYear(); 182 const cardYear = new Date(timeStamp).getFullYear(); 183 const timeGap = now - timeStamp; 184 const todayBegin = getDayBeginTimeStamp(now); 185 const yesterdayBegin = todayBegin - MILLISECOND.ONE_DAY; 186 if (timeStamp > todayBegin) { 187 if (timeGap < MILLISECOND.ONE_MINUTE) { 188 dateString = $r('app.string.justNow'); 189 } else if (timeGap < MILLISECOND.ONE_HOUR) { 190 const minute = Math.floor(timeGap / MILLISECOND.ONE_MINUTE); 191 dateString = $r('app.plural.minute_ago', minute, minute); 192 } else { 193 dateString = $r('app.string.today'); 194 } 195 } else if (timeStamp > yesterdayBegin) { 196 dateString = $r('app.string.yesterday'); 197 } else if (cardYear === nowYear) { 198 const format = LanguageUtil.isChineseLanguage() ? DATE_FORMAT.MM_DD_CHINESE : DATE_FORMAT.MM_DD; 199 dateString = formatDate(timeStamp, format); 200 } else { 201 dateString = getSimpleDateString(timeStamp); 202 } 203 return dateString; 204 } 205} 206 207export default DateTimeUtil; 208