📄 ptime.cxx
字号:
return GreaterThan;
if (microseconds < other.microseconds)
return LessThan;
if (microseconds > other.microseconds)
return GreaterThan;
return EqualTo;
}
PString PTime::AsString(TimeFormat format, int zone) const
{
if (format >= NumTimeStrings)
return "Invalid format : " + AsString("yyyy-MM-dd T hh:mm:ss Z");
switch (format) {
case RFC1123 :
return AsString("wwwe, dd MMME yyyy hh:mm:ss z", zone);
case ShortISO8601 :
return AsString("yyyyMMddThhmmssZ");
case LongISO8601 :
return AsString("yyyy-MM-dd T hh:mm:ss Z");
default :
break;
}
PString fmt, dsep;
PString tsep = GetTimeSeparator();
BOOL is12hour = GetTimeAMPM();
switch (format ) {
case LongDateTime :
case LongTime :
case MediumDateTime :
case ShortDateTime :
case ShortTime :
if (!is12hour)
fmt = "h";
fmt += "h" + tsep + "mm";
switch (format) {
case LongDateTime :
case LongTime :
fmt += tsep + "ss";
default :
break;
}
if (is12hour)
fmt += "a";
break;
default :
break;
}
switch (format ) {
case LongDateTime :
case MediumDateTime :
case ShortDateTime :
fmt += ' ';
break;
default :
break;
}
switch (format ) {
case LongDateTime :
case LongDate :
fmt += "wwww ";
switch (GetDateOrder()) {
case MonthDayYear :
fmt += "MMMM d, yyyy";
break;
case DayMonthYear :
fmt += "d MMMM yyyy";
break;
case YearMonthDay :
fmt += "yyyy MMMM d";
}
break;
case MediumDateTime :
case MediumDate :
fmt += "www ";
switch (GetDateOrder()) {
case MonthDayYear :
fmt += "MMM d, yy";
break;
case DayMonthYear :
fmt += "d MMM yy";
break;
case YearMonthDay :
fmt += "yy MMM d";
}
break;
case ShortDateTime :
case ShortDate :
dsep = GetDateSeparator();
switch (GetDateOrder()) {
case MonthDayYear :
fmt += "MM" + dsep + "dd" + dsep + "yy";
break;
case DayMonthYear :
fmt += "dd" + dsep + "MM" + dsep + "yy";
break;
case YearMonthDay :
fmt += "yy" + dsep + "MM" + dsep + "dd";
}
break;
default :
break;
}
if (zone != Local)
fmt += " z";
return AsString(fmt, zone);
}
PString PTime::AsString(const char * format, int zone) const
{
PAssert(format != NULL, PInvalidParameter);
BOOL is12hour = strchr(format, 'a') != NULL;
PStringStream str;
str.fill('0');
// the localtime call automatically adjusts for daylight savings time
// so take this into account when converting non-local times
if (zone == Local)
zone = GetTimeZone(); // includes daylight savings time
time_t realTime = theTime + zone*60; // to correct timezone
struct tm ts;
struct tm * t = os_gmtime(&realTime, &ts);
PINDEX repeatCount;
while (*format != '\0') {
repeatCount = 1;
switch (*format) {
case 'a' :
while (*++format == 'a')
;
if (t->tm_hour < 12)
str << GetTimeAM();
else
str << GetTimePM();
break;
case 'h' :
while (*++format == 'h')
repeatCount++;
str << setw(repeatCount) << (is12hour ? (t->tm_hour+11)%12+1 : t->tm_hour);
break;
case 'm' :
while (*++format == 'm')
repeatCount++;
str << setw(repeatCount) << t->tm_min;
break;
case 's' :
while (*++format == 's')
repeatCount++;
str << setw(repeatCount) << t->tm_sec;
break;
case 'w' :
while (*++format == 'w')
repeatCount++;
if (repeatCount != 3 || *format != 'e')
str << GetDayName((Weekdays)t->tm_wday, repeatCount <= 3 ? Abbreviated : FullName);
else {
static const char * const EnglishDayName[] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};
str << EnglishDayName[t->tm_wday];
format++;
}
break;
case 'M' :
while (*++format == 'M')
repeatCount++;
if (repeatCount < 3)
str << setw(repeatCount) << (t->tm_mon+1);
else if (repeatCount > 3 || *format != 'E')
str << GetMonthName((Months)(t->tm_mon+1),
repeatCount == 3 ? Abbreviated : FullName);
else {
static const char * const EnglishMonthName[] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
str << EnglishMonthName[t->tm_mon];
format++;
}
break;
case 'd' :
while (*++format == 'd')
repeatCount++;
str << setw(repeatCount) << t->tm_mday;
break;
case 'y' :
while (*++format == 'y')
repeatCount++;
if (repeatCount < 3)
str << setw(2) << (t->tm_year%100);
else
str << setw(4) << (t->tm_year+1900);
break;
case 'z' :
case 'Z' :
if (zone == 0) {
if (*format == 'Z')
str << 'Z';
else
str << "GMT";
}
else {
str << (zone < 0 ? '-' : '+');
zone = PABS(zone);
str << setw(2) << (zone/60) << setw(2) << (zone%60);
}
while (toupper(*++format) == 'z')
;
break;
case 'u' :
while (*++format == 'u')
repeatCount++;
switch (repeatCount) {
case 1 :
str << (microseconds/100000);
break;
case 2 :
str << setw(2) << (microseconds/10000);
break;
case 3 :
str << setw(3) << (microseconds/1000);
break;
default :
str << setw(6) << microseconds;
break;
}
break;
case '\\' :
format++;
// Escaped character, put straight through to output string
default :
str << *format++;
}
}
return str;
}
///////////////////////////////////////////////////////////
//
// Time parser
//
extern "C" {
#ifndef STDAPICALLTYPE
#define STDAPICALLTYPE
#endif
time_t STDAPICALLTYPE PTimeParse(void *, struct tm *, int);
int STDAPICALLTYPE PTimeGetChar(void * stream)
{
return ((istream *)stream)->get();
}
void STDAPICALLTYPE PTimeUngetChar(void * stream, int c)
{
((istream *)stream)->putback((char)c);
}
int STDAPICALLTYPE PTimeGetDateOrder()
{
return PTime::GetDateOrder();
}
int STDAPICALLTYPE PTimeIsMonthName(const char * str, int month, int abbrev)
{
return PTime::GetMonthName((PTime::Months)month,
abbrev ? PTime::Abbreviated : PTime::FullName) *= str;
}
int STDAPICALLTYPE PTimeIsDayName(const char * str, int day, int abbrev)
{
return PTime::GetDayName((PTime::Weekdays)day,
abbrev ? PTime::Abbreviated : PTime::FullName) *= str;
}
};
void PTime::ReadFrom(istream & strm)
{
time_t now;
struct tm timeBuf;
time(&now);
microseconds = 0;
strm >> ws;
theTime = PTimeParse(&strm, os_localtime(&now, &timeBuf), GetTimeZone());
}
PTime PTime::operator+(const PTimeInterval & t) const
{
time_t secs = theTime + t.GetSeconds();
long usecs = (long)(microseconds + (t.GetMilliSeconds()%1000)*1000);
if (usecs < 0) {
usecs += 1000000;
secs--;
}
else if (usecs >= 1000000) {
usecs -= 1000000;
secs++;
}
return PTime(secs, usecs);
}
PTime & PTime::operator+=(const PTimeInterval & t)
{
theTime += t.GetSeconds();
microseconds += (long)(t.GetMilliSeconds()%1000)*1000;
if (microseconds < 0) {
microseconds += 1000000;
theTime--;
}
else if (microseconds >= 1000000) {
microseconds -= 1000000;
theTime++;
}
return *this;
}
PTimeInterval PTime::operator-(const PTime & t) const
{
time_t secs = theTime - t.theTime;
long usecs = microseconds - t.microseconds;
if (usecs < 0) {
usecs += 1000000;
secs--;
}
else if (usecs >= 1000000) {
usecs -= 1000000;
secs++;
}
return PTimeInterval(usecs/1000, secs);
}
PTime PTime::operator-(const PTimeInterval & t) const
{
time_t secs = theTime - t.GetSeconds();
long usecs = (long)(microseconds - (t.GetMilliSeconds()%1000)*1000);
if (usecs < 0) {
usecs += 1000000;
secs--;
}
else if (usecs >= 1000000) {
usecs -= 1000000;
secs++;
}
return PTime(secs, usecs);
}
PTime & PTime::operator-=(const PTimeInterval & t)
{
theTime -= t.GetSeconds();
microseconds -= (long)(t.GetMilliSeconds()%1000)*1000;
if (microseconds < 0) {
microseconds += 1000000;
theTime--;
}
else if (microseconds >= 1000000) {
microseconds -= 1000000;
theTime++;
}
return *this;
}
// End Of File ///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -