• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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