Files
oceanbase/src/share/ob_time_utility2.h
wangzelin.wzl 93a1074b0c patch 4.0
2022-10-24 17:57:12 +08:00

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_