• 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 * 日期格式常量
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