今天开始新的一期自虐行为,练习250测中的输入一个数字,判断并输出对应的星期名字的习题。然后我又跳了。因为说实话c++11以下的版本好像很少有像C#里面的DateTime和Java里的LocalDate以及LocalDateTime这样简单好用的时间胶囊类。所以这次打算自己写一个类似的c++版的时间胶囊类:
- 可以获取当前本地的最新时间。
- 可以通过millisecond构建时间。
- 可以获取时间中的year, month以及day部分数值,甚至hour, minute和second等。
- 可以format输出特定的时间戳字符串。
- 可以parse特定的时间戳字符串并构建时间。
- 可以对year,month, day,hour,minute,second各刻度上进行加减算术运算。
- 可以判断两个时间的早晚。
在上面的需求中,我预计可以了解c++关于类,抽象,继承以及虚函数等面向对象的概念有一个全面的实践。
首先需要定义一个抽象概念就是时间刻度。Year,month,day,hour,minute和second都是一个时间刻度。具体的定义如下:
class TimeScale
{
protected:
const TimeScale* parent = nullptr;
const TimeScale* child = nullptr;
int value;
int max;
/// @brief 设置值
/// @param result
virtual void setValue(int result);
/// @brief 处理进位
/// @param result
virtual void handleCarry(int carry);
/// @brief 重新检查子刻度,处理特殊逻辑
virtual void recheckChild();
public:
TimeScale(int value, int max);
TimeScale(const TimeScale*parent, int value, int max);
/// @brief 添加子类
/// @param child
void setChild(const TimeScale* child);
virtual void operator+(const int i);
virtual void operator-(const int i);
/// @brief 获取当前值
/// @return
const int getValue();
/// @brief 获取高级刻度
/// @return
const TimeScale* getParent(){
return parent;
}
virtual ~TimeScale();
}
其中声明了parent和child分别构建一个类似上下级的刻度链,用于通过handleCarry, recheckChild处理单位进位逻辑和特殊时间影响。例如,如果是12月31日,我们在时间上加上一天,那么day会变为1,同时进位month再加上1.而在month加上1后,会变为1,又会进位year。而像month从其他月份变为2月份,那么就需要对day>28进行特殊处理。
暂时目前挖的坑是这样的,后续要怎么跳还得再斟酌一下。另外可能还要对时间刻度在copy等操作上进一步补全用于支持整个时间的拷贝以及还有大小比较操作等。