126 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**
 | |
|  * Copyright (c) 2021 OceanBase
 | |
|  * OceanBase CE is licensed under Mulan PubL v2.
 | |
|  * You can use this software according to the terms and conditions of the Mulan PubL v2.
 | |
|  * You may obtain a copy of Mulan PubL v2 at:
 | |
|  *          http://license.coscl.org.cn/MulanPubL-2.0
 | |
|  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | |
|  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | |
|  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | |
|  * See the Mulan PubL v2 for more details.
 | |
|  */
 | |
| 
 | |
| #ifndef _OCEANBASE_COMMON_OB_TIME_UTILITY2_H_
 | |
| #define _OCEANBASE_COMMON_OB_TIME_UTILITY2_H_
 | |
| #include <stdio.h>
 | |
| #include <time.h>
 | |
| #include "lib/string/ob_string.h"
 | |
| #include "lib/ob_date_unit_type.h"
 | |
| #include "lib/time/ob_time_utility.h"
 | |
| #include "share/ob_define.h"
 | |
| 
 | |
| #define START_WITH_SUNDAY       0x04
 | |
| #define WEEK_FIRST_WEEKDAY      0x02
 | |
| #define INCLUDE_CRITICAL_WEEK   0x01
 | |
| 
 | |
| namespace oceanbase
 | |
| {
 | |
| namespace share
 | |
| {
 | |
| class ObTimeUtility2
 | |
| {
 | |
|   using ObString = common::ObString;
 | |
|   enum ObHourFlag
 | |
|   {
 | |
|     HOUR_UNUSE,
 | |
|     HOUR_AM,
 | |
|     HOUR_PM
 | |
|   };
 | |
| public:
 | |
|   enum DecimalDigts
 | |
|   {
 | |
|     DIGTS_INSENSITIVE,
 | |
|     DIGTS_SENSITIVE
 | |
|   };
 | |
|   static const char *STD_TS_FORMAT_WITH_USEC;
 | |
|   static const char *STD_TS_FORMAT_WITHOUT_USEC;
 | |
| public:
 | |
|   //call mktime() to make seconds from strcut tm, and check seconds whether valid
 | |
|   static int make_second(struct tm &t, time_t &second);
 | |
|   static int timestamp_to_usec(struct tm &base_tm, int64_t base_usec, int64_t &result_usec);
 | |
|   static time_t extract_second(int64_t usec);
 | |
|   static int str_to_timestamp(const ObString &date, struct tm &t, int64_t &usec);
 | |
|   static int str_to_usec(const ObString &date, int64_t &usec);
 | |
|   static int str_to_time(const ObString &date, int64_t &usec, DecimalDigts num_flag = DIGTS_INSENSITIVE);
 | |
|   static int extract_usec(const ObString &str, int64_t &pos, int64_t &usec, DecimalDigts num_flag);
 | |
|   static int extract_date(const ObString &str, int n, int64_t &pos, int64_t &value);
 | |
|   /**
 | |
|    * @brief calculate weeks of the year use struct member tm_yday and tm_wday, and alter tm_year
 | |
|    * @param flag_mask: START_WITH_SUNDAY, if set, the week will use Sunday as the first weekday
 | |
|    * WEEK_FIRST_WEEKDAY, if set, use the first unbroken week as the first week in this year,
 | |
|    * otherwise, use ISO 8601:1988 to decide the belongs of the critical week
 | |
|    * INCLUDE_CRITICAL_WEEK, if set, use WEEK_FIRST_WEEKDAY or ISO 8601:1988 to decide the
 | |
|    * critical week, otherwise, discard it in this year
 | |
|    */
 | |
|   static int get_weeks_of_year(struct tm &t, uint8_t flag_mask);
 | |
|   static int timestamp_format_to_str(const struct tm &t, int64_t usec, const ObString &format,
 | |
|                                      char *buf, int64_t buf_len, int64_t &pos);
 | |
|   static int usec_format_to_str(int64_t usec, const ObString &format, char *buf, int64_t buf_len,
 | |
|                                 int64_t &pos);
 | |
|   /**
 | |
|    * @brief format usec to str with default format,
 | |
|    * if the time has no microsecond, the format is 'YY-MM-DD HH:MM:SS.U'
 | |
|    * otherwise, the format is 'YY-MM-DD HH:MM:SS'
 | |
|    */
 | |
|   static int usec_to_str(int64_t usec, char *buf, int64_t buf_len, int64_t &pos);
 | |
|   static bool is_valid_date(int year, int month, int mday);
 | |
|   static bool is_valid_time(int hour, int minute, int second, int usec = 0);
 | |
|   static bool is_valid_oracle_time(int hour, int minute, int second, int32_t nsec = 0);
 | |
|   static bool is_valid_time_offset(int hour, int minute);
 | |
|   static bool is_leap_year(int year);
 | |
|   static int64_t timediff(const struct timeval &tv1, const struct timeval &tv2);
 | |
| private:
 | |
|   static bool is_valid_year(int year);
 | |
|   static bool is_valid_month(int month);
 | |
|   //day of the month
 | |
|   static bool is_valid_mday(int year, int month, int mday);
 | |
|   //24-Hour
 | |
|   static bool is_valid_hour(int hour);
 | |
|   static bool is_valid_hour_offset(int hour);
 | |
|   static bool is_valid_minute(int minute);
 | |
|   static bool is_valid_second(int second);
 | |
|   static bool is_valid_usec(int usec);
 | |
|   static bool is_valid_nsec(int nsec);
 | |
|   /**
 | |
|    * @brief calculate the start weekday of the year, and return the start weekday
 | |
|    * @param year_day, the days of the specified date in year
 | |
|    * @param week_day, the days of the specified date in it's week
 | |
|    * @param week_first_weekday, if true, use WEEK_FIRST_WEEKDAY, otherwise, use ISO 8601:1988
 | |
|    *        to decide the start weekday
 | |
|    */
 | |
|   static int get_start_weekday(int year_day, int week_day, bool week_first_weekday);
 | |
|   /**
 | |
|    * @brief check the date whether in the next year's first week
 | |
|    */
 | |
|   static bool check_in_next_critical_week(int yday, int wday, int year, uint8_t flag_mask);
 | |
| private:
 | |
|   static const char *mday_name_[31];
 | |
|   static const char *weekday_name_[7];
 | |
|   static const char *weekday_abbr_name_[7];
 | |
|   static const char *month_name_[12];
 | |
|   static const char *month_abbr_name_[12];
 | |
| private:
 | |
|   ObTimeUtility2() = delete;
 | |
| };
 | |
| 
 | |
| inline int64_t ObTimeUtility2::timediff(const struct timeval &tv1, const struct timeval &tv2)
 | |
| {
 | |
|   return (tv1.tv_sec * INT64_C(1000000) + tv1.tv_usec)
 | |
|       - (tv2.tv_sec * INT64_C(1000000) + tv2.tv_usec);
 | |
| }
 | |
| 
 | |
| } // share
 | |
| } // oceanbase
 | |
| 
 | |
| #endif //_OCEANBASE_COMMON_OB_TIME_UTILITY_H_
 | 
