9#include <QLoggingCategory>
10#include <QSharedPointer>
13static Q_LOGGING_CATEGORY(Logger,
"Rabbit.LunarCalendar.table")
15static const QString g_Signature = "Lunar cache table. Author: Kang Lin(kl222@126.com)";
28void CThreadGenerate::run()
30 qDebug(Logger) <<
"CThreadGenerate::run()";
32 m_pTable->Generate(m_minDate, m_maxDate, m_bCached);
35CLunarTable::CLunarTable(QObject *parent) : QObject(parent)
37 m_bSaveAllDate =
true;
39 Load(
":/data/LunarCalendarTable");
50#ifndef QT_NO_DATASTREAM
76int CLunarTable::Save(
const QString &file,
bool bAll)
83 if(!f.open(QIODevice::WriteOnly))
85 qCritical(Logger) <<
"Open file fail: " << file;
90 CleanOutsideRange(m_minDate, m_maxDate);
95 out << static_cast<qint64>(m_Lunar.size());
96 QMap<qint64, _LUNAR_DAY>::iterator it;
97 for(it = m_Lunar.begin(); it != m_Lunar.end(); it++)
107int CLunarTable::Load(
const QString &file)
110 uint8_t nVersion = 0;
113 if(!f.open(QIODevice::ReadOnly))
115 qCritical() <<
"Open file fail: " << file;
120 if(g_Signature != signature)
122 qCritical() <<
"Luanar table Signature error: " << signature;
130 nRet = LoadVersion0(in);
133 qCritical() <<
"Luanar table version[" << nVersion <<
"] don't support";
141int CLunarTable::LoadVersion0(QDataStream &in)
157int CLunarTable::Generate(
const QDate &min,
const QDate &max,
const QString &szFile,
int nThread,
bool bClearCache,
bool bSaveAllDate)
162 m_nThreadNumber = nThread;
166 m_bSaveAllDate = bSaveAllDate;
168 qint64 days = min.daysTo(max);
169 qint64 num = days / nThread;
171 for(
int i = 1; i <= nThread; i++)
177 maxDate = d.addDays(num);
179 d = maxDate.addDays(1);
183 check = connect(pGenerate, SIGNAL(finished()),
184 this, SLOT(slotGenerateFinished()));
186 check = connect(pGenerate, SIGNAL(finished()),
187 pGenerate, SLOT(deleteLater()));
197void CLunarTable::slotGenerateFinished()
199 qDebug(Logger) <<
"Thread finished: " << m_nThreadNumber;
200 if(--m_nThreadNumber)
202 if(m_szFile.isEmpty())
204 qCritical(Logger()) <<
"Cache file is empty";
207 int nRet = Save(m_szFile, m_bSaveAllDate);
209 qInfo(Logger) <<
"Generate finished: save to:" << m_szFile;
211 qCritical(Logger) <<
"Generate finished: save fail" << nRet <<
";" << m_szFile ;
214int CLunarTable::Generate(
const QDate &min,
const QDate &max,
bool bUseCached)
217 if(!min.isValid() || !max.isValid())
221 while(date.isValid() && date <= max)
225 auto it = m_Lunar.find(date.toJulianDay());
226 if(it != m_Lunar.end())
228 date = date.addDays(1);
234 nRet =
GetLunar(date, lunar,
false);
237 m_GenerateMutex.lock();
238 m_Lunar[date.toJulianDay()] = lunar;
239 m_GenerateMutex.unlock();
241 date = date.addDays(1);
254 auto it = m_Lunar.find(date.toJulianDay());
255 if(m_Lunar.end() != it)
262 QSharedPointer<Day> pDay(sxtwl::fromSolar(date.year(), date.month(), date.day()));
270 lunar.nTg = day.getYearGZ().tg;
271 lunar.nDz = day.getYearGZ().dz;
273 lunar.bLeap = day.isLunarLeap();
274 lunar.nYear = day.getLunarYear();
275 lunar.nMonth = day.getLunarMonth();
276 if(lunar.nMonth > 12 || lunar.nMonth < 1)
277 qCritical(Logger) <<
"Lunar month error, data:" << date;
278 lunar.nDay = day.getLunarDay();
279 if(lunar.nDay > 31 || lunar.nDay < 1)
280 qCritical(Logger) <<
"Lunar day error, date:" << date;
283 lunar.nJq = day.getJieQi();
290int CLunarTable::CleanOutsideRange(
const QDate &min,
const QDate &max)
292 if(!min.isValid() || !max.isValid())
294 QMap<qint64, _LUNAR_DAY>::iterator it;
295 for(it = m_Lunar.begin(); it != m_Lunar.end();)
297 qint64 key = it.key();
299 if(key < min.toJulianDay() || key > max.toJulianDay())
int GetLunar(const QDate &date, _LUNAR_DAY &lunar, bool cache=true)
得到指定日期的农历