Skip to content

Commit f80854d

Browse files
committed
handle:修正在23点到0点之间的时间农历日期没有变更到次日的问题。
1 parent 8926b79 commit f80854d

File tree

2 files changed

+136
-124
lines changed

2 files changed

+136
-124
lines changed

calendar/calendar_v1.cpp

+129-122
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,13 @@ bool CCalenderV1::set_datetime(const CDateTime& datetime)
5656
return false;
5757
}
5858

59-
mcopy(datetime, dt_);
59+
// 这里要特殊处理一下,当23点后,农历要计为次日
60+
CDateTime handled = datetime;
61+
if (datetime.time_.h_ == 23) {
62+
next(handled);
63+
handled.time_.h_ = 0;
64+
}
65+
mcopy(handled, dt_);
6066
CDate sdate;
6167
sdate.year_ = 1900;
6268
sdate.mon_ = 1;
@@ -156,6 +162,7 @@ bool CCalenderV1::set_datetime(const CDateTime& datetime)
156162
get_ym_gz();
157163
get_hour_gz();
158164

165+
mcopy(datetime, dt_);
159166
return true;
160167
}
161168

@@ -439,18 +446,18 @@ void CCalenderV1::pre_day(const CDateTime& datetime, CDateTime& outtime)
439446
}
440447
outtime.date_.mon_ = m - 1;
441448
switch (outtime.date_.mon_) {
442-
case 3:
443-
case 5:
444-
case 7:
445-
case 8:
446-
case 10: {
447-
outtime.date_.day_ = 31;
448-
break;
449-
}
450-
default: {
451-
outtime.date_.day_ = 30;
452-
break;
453-
}
449+
case 3:
450+
case 5:
451+
case 7:
452+
case 8:
453+
case 10: {
454+
outtime.date_.day_ = 31;
455+
break;
456+
}
457+
default: {
458+
outtime.date_.day_ = 30;
459+
break;
460+
}
454461
}
455462
return;
456463
}
@@ -495,61 +502,61 @@ void CCalenderV1::get_diff_sec(const CDateTime& basetime, CDateTime& outtime, lo
495502
--year;
496503
}
497504
switch (mon) {
498-
case 4:
499-
case 6:
500-
case 9:
501-
case 11: {
502-
day = 30;
503-
break;
504-
}
505-
case 2: {
506-
if (CCalender::is_leap(year)) {
507-
day = 29;
508-
} else {
509-
day = 28;
510-
}
511-
break;
512-
}
513-
default: {
514-
day = 31;
515-
break;
516-
}
517-
}
518-
}
519-
} else {
520-
++day;
521-
switch (mon) {
522505
case 4:
523506
case 6:
524507
case 9:
525508
case 11: {
526-
if (day == 31) {
527-
day = 1;
528-
++mon;
529-
}
509+
day = 30;
530510
break;
531511
}
532512
case 2: {
533513
if (CCalender::is_leap(year)) {
534-
if (day == 30) {
535-
day = 1;
536-
++mon;
537-
}
514+
day = 29;
538515
} else {
539-
if (day == 29) {
540-
day = 1;
541-
++mon;
542-
}
516+
day = 28;
543517
}
544518
break;
545519
}
546520
default: {
547-
if (day == 32) {
521+
day = 31;
522+
break;
523+
}
524+
}
525+
}
526+
} else {
527+
++day;
528+
switch (mon) {
529+
case 4:
530+
case 6:
531+
case 9:
532+
case 11: {
533+
if (day == 31) {
534+
day = 1;
535+
++mon;
536+
}
537+
break;
538+
}
539+
case 2: {
540+
if (CCalender::is_leap(year)) {
541+
if (day == 30) {
548542
day = 1;
549543
++mon;
550544
}
551-
break;
545+
} else {
546+
if (day == 29) {
547+
day = 1;
548+
++mon;
549+
}
550+
}
551+
break;
552+
}
553+
default: {
554+
if (day == 32) {
555+
day = 1;
556+
++mon;
552557
}
558+
break;
559+
}
553560
}
554561
if (mon == 13) {
555562
mon = 1;
@@ -639,32 +646,32 @@ int CCalenderV1::get_days_from_base(const CDate& date)
639646
}
640647
for (int i = 1; i < m; ++i) {
641648
switch (i) {
642-
case 1:
643-
case 3:
644-
case 5:
645-
case 7:
646-
case 8:
647-
case 10:
648-
case 12:
649-
nm += 31;
650-
break;
651-
case 4:
652-
case 6:
653-
case 9:
654-
case 11:
655-
nm += 30;
656-
break;
657-
case 2: {
658-
if (CCalender::is_leap(y)) {
659-
nm += 29;
660-
} else {
661-
nm += 28;
662-
}
663-
break;
664-
}
665-
default: {
666-
break;
649+
case 1:
650+
case 3:
651+
case 5:
652+
case 7:
653+
case 8:
654+
case 10:
655+
case 12:
656+
nm += 31;
657+
break;
658+
case 4:
659+
case 6:
660+
case 9:
661+
case 11:
662+
nm += 30;
663+
break;
664+
case 2: {
665+
if (CCalender::is_leap(y)) {
666+
nm += 29;
667+
} else {
668+
nm += 28;
667669
}
670+
break;
671+
}
672+
default: {
673+
break;
674+
}
668675
}
669676
}
670677
nd = d - 1;
@@ -679,32 +686,32 @@ int CCalenderV1::get_days_from_base(const CDate& date)
679686
}
680687
for (int i = 1; i < m; ++i) {
681688
switch (i) {
682-
case 1:
683-
case 3:
684-
case 5:
685-
case 7:
686-
case 8:
687-
case 10:
688-
case 12:
689-
nm += 31;
690-
break;
691-
case 4:
692-
case 6:
693-
case 9:
694-
case 11:
695-
nm += 30;
696-
break;
697-
case 2: {
698-
if (CCalender::is_leap(y)) {
699-
nm += 29;
700-
} else {
701-
nm += 28;
702-
}
703-
break;
704-
}
705-
default: {
706-
break;
689+
case 1:
690+
case 3:
691+
case 5:
692+
case 7:
693+
case 8:
694+
case 10:
695+
case 12:
696+
nm += 31;
697+
break;
698+
case 4:
699+
case 6:
700+
case 9:
701+
case 11:
702+
nm += 30;
703+
break;
704+
case 2: {
705+
if (CCalender::is_leap(y)) {
706+
nm += 29;
707+
} else {
708+
nm += 28;
707709
}
710+
break;
711+
}
712+
default: {
713+
break;
714+
}
708715
}
709716
}
710717
nd = d - 1;
@@ -727,28 +734,28 @@ void CCalenderV1::next_day(const CDateTime& datetime, CDateTime& outtime)
727734

728735
int nDay = 0;
729736
switch (m) {
730-
case 1:
731-
case 3:
732-
case 5:
733-
case 7:
734-
case 8:
735-
case 10:
736-
case 12: {
737-
nDay = 31;
738-
break;
739-
}
740-
case 2: {
741-
if (CCalender::is_leap(y)) {
742-
nDay = 29;
743-
} else {
744-
nDay = 28;
745-
}
746-
break;
747-
}
748-
default: {
749-
nDay = 30;
750-
break;
737+
case 1:
738+
case 3:
739+
case 5:
740+
case 7:
741+
case 8:
742+
case 10:
743+
case 12: {
744+
nDay = 31;
745+
break;
746+
}
747+
case 2: {
748+
if (CCalender::is_leap(y)) {
749+
nDay = 29;
750+
} else {
751+
nDay = 28;
751752
}
753+
break;
754+
}
755+
default: {
756+
nDay = 30;
757+
break;
758+
}
752759
}
753760

754761
if (m <= 11) {

calendar/calendar_v2.cpp

+7-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@ CCalenderV2::~CCalenderV2()
1212

1313
bool CCalenderV2::set_datetime(const CDateTime& datetime)
1414
{
15-
dt_ = datetime;
16-
15+
CDateTime handled = datetime;
16+
if (datetime.time_.h_ == 23) {
17+
next(handled);
18+
handled.time_.h_ = 0;
19+
}
20+
dt_ = handled;
1721
if (day_) {
1822
delete day_;
1923
}
@@ -104,6 +108,7 @@ bool CCalenderV2::set_datetime(const CDateTime& datetime)
104108
}
105109
}
106110
check_mon_gz();
111+
dt_ = datetime;
107112
return true;
108113
}
109114

0 commit comments

Comments
 (0)