1/**
2 * Copyright (c) 2022 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 */
15import common from '../data/commonData';
16import HiLog from './HiLog';
17
18// Time constant
19const ONE_MINUTE_IN_MILLISECOND = 60000;
20const ONE_HOUR_IN_MILLISECOND = 3600000;
21
22const TAG = 'DateUtil';
23
24export default {
25
26  /**
27   * Converts the timestamp of an item to a time (for the SMS message list).
28   *
29   * @param messageItem
30   * @param is24HourTime
31   * @return
32   */
33  convertDateFormatForItem(messageItem, is24HourTime) {
34    let now = new Date();
35    let currentDate = {
36      timeOfNow: now.getTime(),
37      yearOfNow: now.getFullYear(),
38      monthOfNow: now.getMonth() + 1,
39      dayOfNow: now.getDate()
40    };
41    let timeMillisecond = messageItem.timeMillisecond;
42    messageItem.time = this.convertTimeStampToTime(timeMillisecond, currentDate, is24HourTime);
43  },
44
45  /**
46   * Converting a Timestamp to a Time (for SMS List)
47   *
48   * @param timeStampFromDb Timeline to be converted
49   * @param currentDate Current Time
50   * @param is24HourTime
51   * @return
52   */
53  convertTimeStampToTime(timeStampFromDb, currentDate, is24HourTime) {
54    let sms = new Date(timeStampFromDb);
55    let timeStampOfSms = sms.getTime();
56    let yearOfSms = sms.getFullYear();
57    let monthOfSms = sms.getMonth() + 1;
58    let dayOfSms = sms.getDate();
59    let hoursOfSms = sms.getHours();
60    let minutesOfSms = sms.getMinutes();
61    let diff = currentDate.timeOfNow - timeStampOfSms;
62    if (currentDate.yearOfNow == yearOfSms && currentDate.monthOfNow ==
63      monthOfSms && currentDate.dayOfNow == dayOfSms) {
64      if (diff < ONE_MINUTE_IN_MILLISECOND) {
65        return $r('app.string.justNow');
66      } else if (diff < ONE_HOUR_IN_MILLISECOND) {
67        return $r('app.string.minAgo', Math.floor(diff / ONE_MINUTE_IN_MILLISECOND));
68      } else {
69        let hoursOfSmsStr: string = '' + hoursOfSms;
70        let minutesOfSmsStr: string = '' + minutesOfSms;
71        if (hoursOfSms < 10) {
72          hoursOfSmsStr = '0' + hoursOfSms;
73        }
74        if (minutesOfSms < 10) {
75          minutesOfSmsStr = '0' + minutesOfSms;
76        }
77        if (is24HourTime) {
78          return $r('app.string.hourAndMinute', hoursOfSmsStr, minutesOfSmsStr);
79        } else {
80          return this.timeTwelveHourSystem(hoursOfSms, minutesOfSmsStr, hoursOfSmsStr);
81        }
82      }
83    } else if (currentDate.yearOfNow == yearOfSms && currentDate.monthOfNow ==
84      monthOfSms && currentDate.dayOfNow - dayOfSms == 1) {
85      return $r('app.string.yesterday');
86    } else if (currentDate.yearOfNow == yearOfSms) {
87      return $r('app.string.monthDay', monthOfSms, dayOfSms);
88    } else {
89      return $r('app.string.yearMonthDay', yearOfSms, monthOfSms, dayOfSms);
90    }
91  },
92
93  timeTwelveHourSystem(hoursOfSms, minutesOfSmsStr, hoursOfSmsStr) {
94    let time: Resource = null;
95    if (hoursOfSms <= 12) {
96      time = this.morningTimeTwelveHourSystem(hoursOfSms, minutesOfSmsStr, hoursOfSmsStr);
97    } else {
98      time = this.afterTimeTwelveHourSystem(hoursOfSms, minutesOfSmsStr, hoursOfSmsStr);
99    }
100    return time;
101  },
102
103  morningTimeTwelveHourSystem(hoursOfSms, minutesOfSmsStr, hoursOfSmsStr) {
104    let time: Resource = null;
105    // 12-hour clock
106    if (hoursOfSms < 1) {
107      time = $r('app.string.postMidnight', 12 + '', minutesOfSmsStr);
108    }
109    if (hoursOfSms >= 1 && hoursOfSms < 4) {
110      time = $r('app.string.beforeDawn', hoursOfSmsStr, minutesOfSmsStr);
111    }
112    if (hoursOfSms >= 4 && hoursOfSms < 6) {
113      time = $r('app.string.earlyMorning', hoursOfSmsStr, minutesOfSmsStr);
114    }
115    if (hoursOfSms >= 6 && hoursOfSms < 9) {
116      time = $r('app.string.morning', hoursOfSmsStr, minutesOfSmsStr);
117    }
118    if (hoursOfSms >= 9 && hoursOfSms < 11) {
119      time = $r('app.string.forenoon', hoursOfSmsStr, minutesOfSmsStr);
120    }
121    if (hoursOfSms >= 11 && hoursOfSms <= 12) {
122      time = $r('app.string.preNoon', hoursOfSms + '', minutesOfSmsStr);
123    }
124    return time;
125  },
126
127  afterTimeTwelveHourSystem(hoursOfSms, minutesOfSmsStr, hoursOfSmsStr) {
128    let time: Resource = null;
129    if (hoursOfSms > 12 && hoursOfSms < 13) {
130      time = $r('app.string.postNoon', hoursOfSms + '', minutesOfSmsStr);
131    }
132    if (hoursOfSms >= 13 && hoursOfSms < 17) {
133      time = $r('app.string.afternoon', (hoursOfSms - 12) + '', minutesOfSmsStr);
134    }
135    if (hoursOfSms >= 17 && hoursOfSms < 19) {
136      time = $r('app.string.towardEvening', (hoursOfSms - 12) + '', minutesOfSmsStr);
137    }
138    if (hoursOfSms >= 19 && hoursOfSms < 23) {
139      time = $r('app.string.evening', (hoursOfSms - 12) + '', minutesOfSmsStr);
140    }
141    if (hoursOfSms >= 23) {
142      time = $r('app.string.preMidnight', (hoursOfSms - 12) + '', minutesOfSmsStr);
143    }
144    return time;
145  },
146
147  /**
148   * Converting Time
149   * @param messageItem
150   * @param is24HourTime
151   * @param that
152   * @return
153   */
154  convertTimeStampToDateWeek(messageItem, is24HourTime) {
155    let now = new Date();
156    let yearOfNow = now.getFullYear();
157    let monthOfNow = now.getMonth() + 1;
158    let dayOfNow = now.getDate();
159    let timeMillisecond = messageItem.timeMillisecond;
160    this.convertTimeStampToDate(messageItem, timeMillisecond, yearOfNow, monthOfNow, dayOfNow);
161  },
162
163  /**
164   * Converts the timestamp form to the date form.
165   */
166  convertTimeStampToDate(messageItem, timeStampFromDb, yearOfNow, monthOfNow, dayOfNow) {
167    let date: Resource = null;
168    let sms = new Date(timeStampFromDb);
169    let yearOfSms = sms.getFullYear();
170    let monthOfSms = sms.getMonth() + 1;
171    let dayOfSms = sms.getDate();
172    let weekOfSms = sms.getDay();
173    if (yearOfNow == yearOfSms && monthOfNow == monthOfSms && dayOfNow == dayOfSms) {
174      date = $r('app.string.recentDateToday', '');
175    } else if (yearOfNow == yearOfSms && monthOfNow == monthOfSms && dayOfNow - dayOfSms == 1) {
176      date = $r('app.string.recentDateYesterday', '');
177    } else if (yearOfNow == yearOfSms) {
178      date = $r('app.string.monthDayDate', monthOfSms, dayOfSms, '');
179    } else {
180      date = $r('app.string.yearMonthDayDate', yearOfSms, monthOfSms, dayOfSms, '');
181    }
182    messageItem.date = date;
183    messageItem.week = this.getWeek(weekOfSms);
184  },
185
186  /**
187   * Get Week/Day of the Week
188   * @param day
189   * @param that
190   * @return
191   */
192  getWeek(day) {
193    let week: Resource = null;
194    switch (day) {
195      case 0:
196        week = $r('app.string.Sunday');
197        break;
198      case 1:
199        week = $r('app.string.Monday');
200        break;
201      case 2:
202        week = $r('app.string.Tuesday');
203        break;
204      case 3:
205        week = $r('app.string.Wednesday');
206        break;
207      case 4:
208        week = $r('app.string.Thursday');
209        break;
210      case 5:
211        week = $r('app.string.Friday');
212        break;
213      case 6:
214        week = $r('app.string.Saturday');
215        break;
216
217    }
218    return week;
219  },
220
221  convertTimeStampDate(timeStampFromDb) {
222    let date: Resource = null;
223    let sms = new Date(Number(timeStampFromDb));
224    let yearOfSms = sms.getFullYear();
225    let monthOfSms = sms.getMonth() + 1;
226    let dayOfSms = sms.getDate();
227    let weekOfSms = sms.getDay();
228    date = $r('app.string.yearMonthDayDate', yearOfSms, monthOfSms, dayOfSms, '');
229    return date;
230  },
231
232  /**
233   *
234   * @param timeStampFromDb
235   * @param is24HourTime
236   * @param that
237   * @return
238   */
239  convertTimeStampTime(timeStampFromDb, is24HourTime) {
240    let sms = new Date(Number(timeStampFromDb));
241    let hoursOfSms = sms.getHours();
242    let minutesOfSms = sms.getMinutes();
243    let hoursOfSmsStr: string = hoursOfSms + '';
244    let minutesOfSmsStr: string = minutesOfSms + '';
245    if (hoursOfSms < 10) {
246      hoursOfSmsStr = '0' + hoursOfSms;
247    }
248    if (minutesOfSms < 10) {
249      minutesOfSmsStr = '0' + minutesOfSms;
250    }
251    if (is24HourTime) {
252      // 24-hour clock
253      return $r('app.string.hourAndMinute', hoursOfSmsStr, minutesOfSmsStr);
254    }
255    return this.timeTwelveHourSystem(hoursOfSms, minutesOfSmsStr, hoursOfSmsStr);
256  },
257
258  fullDate(item) {
259    let timeOfSms: Resource = null;
260    let fullDate: Resource = null;
261    let sms = new Date(item.timeMillisecond);
262    let yearOfSms = sms.getFullYear();
263    let monthOfSms = sms.getMonth() + 1;
264    let dayOfSms = sms.getDate();
265    let hoursOfSms = sms.getHours();
266    let minutesOfSms = sms.getMinutes();
267    let hoursOfSmsStr: string = hoursOfSms + '';
268    let minutesOfSmsStr: string = minutesOfSms + '';
269    if (hoursOfSms > 12) {
270      hoursOfSmsStr = '' + (hoursOfSms - 12);
271    }
272    if (minutesOfSms < 10) {
273      minutesOfSmsStr = '0' + minutesOfSms;
274    }
275    if (hoursOfSms < 12) {
276      timeOfSms = $r('app.string.forenoon', hoursOfSmsStr, minutesOfSmsStr);
277    } else {
278      timeOfSms = $r('app.string.afternoon', hoursOfSmsStr, minutesOfSmsStr);
279    }
280    fullDate = $r('app.string.yearMonthDayDate', yearOfSms, monthOfSms, dayOfSms, '');
281    item.fullDate = fullDate;
282    item.timeOfSms = timeOfSms;
283  }
284}