⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ptime.cxx

📁 mgcp协议源代码。支持多种编码:g711
💻 CXX
📖 第 1 页 / 共 2 页
字号:
/* * ptime.cxx * * Time and date classes. * * Portable Windows Library * * Copyright (c) 1993-1998 Equivalence Pty. Ltd. * * The contents of this file are subject to the Mozilla Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. * * The Original Code is Portable Windows Library. * * The Initial Developer of the Original Code is Equivalence Pty. Ltd. * * Portions are Copyright (C) 1993 Free Software Foundation, Inc. * All Rights Reserved. * * Contributor(s): ______________________________________. * * $Log: ptime.cxx,v $ * Revision 1.35  2000/04/29 08:11:06  robertj * Fixed problem with stream output width in PTimeInterval * * Revision 1.34  2000/04/29 04:50:16  robertj * Added microseconds to string output. * Fixed uninitialised microseconds on some constructors. * * Revision 1.33  2000/04/28 13:23:25  robertj * Fixed printing of negative time intervals. * * Revision 1.32  2000/04/18 06:01:01  robertj * Fixed integer overflow bug in PTime addition functions, thanks Ian MacDonald * * Revision 1.31  2000/04/05 02:50:17  robertj * Added microseconds to PTime class. * * Revision 1.30  2000/03/08 17:56:33  rogerh * Fix error in creation of a PStringStream from a PString * * Revision 1.29  2000/03/06 04:09:23  robertj * Added constructor to do PString conversion to PTimeInterval * * Revision 1.28  1999/10/14 08:23:20  robertj * Fixed display of decimals in milliseconds when precision other than 3. * * Revision 1.27  1999/08/08 12:39:24  robertj * Fixed bug in display of PTimeIntervals larger than 24 hours. * * Revision 1.26  1999/06/14 07:58:39  robertj * Fixed bug in PTimeInteerval output, left stream fill char as '0'. * Added ability to set the width of the PTimeInterval stream output. * * Revision 1.25  1999/03/29 03:38:58  robertj * Improved time & date parser. * * Revision 1.24  1998/11/30 12:31:46  robertj * Removed redundent conditionals. * * Revision 1.23  1998/11/14 01:11:45  robertj * PPC linux GNU compatibility. * * Revision 1.22  1998/09/23 06:22:36  robertj * Added open source copyright license. * * Revision 1.21  1998/03/05 12:49:53  robertj * MemCheck fixes. * * Revision 1.20  1998/01/26 00:48:30  robertj * Removed days from PTimeInterval PrintOn(), can get it back by using negative precision. * Fixed Y2K problem in parsing dates. * * Revision 1.19  1998/01/04 07:24:32  robertj * Added operating system specific versions of gmtime and localtime. * * Revision 1.18  1997/07/08 13:05:21  robertj * Fixed bug in parsing time zone incorrectly. * * Revision 1.17  1997/05/16 12:05:57  robertj * Changed PTimeInterval to guarentee no overflow in millisecond calculations. * * Revision 1.16  1997/03/18 21:24:19  robertj * Fixed parsing of time putting back token after time zone. * * Revision 1.15  1997/01/03 04:40:03  robertj * Changed default time so if no year goes to last 12 months rather than current year. * * Revision 1.14  1996/10/26 01:40:12  robertj * Fixed bug in time parser that caused endless looping. * * Revision 1.13  1996/08/20 12:07:29  robertj * Fixed volatile milliseconds member of PTimeInterval for printing. * * Revision 1.12  1996/07/27 04:11:28  robertj * Added bullet proofing for invlid times - especially in Western time zones. * * Revision 1.11  1996/07/15 12:43:01  robertj * Fixed MSVC 4.1 compiler bug. * * Revision 1.10  1996/06/17 11:34:48  robertj * Fixed bug in NOT localising RFC1123 time. * * Revision 1.9  1996/05/09 12:18:16  robertj * Fixed syntax error found by Mac platform. * Resolved C++ problems with 64 bit PTimeInterval for Mac platform. * * Revision 1.8  1996/03/17 05:43:42  robertj * Changed PTimeInterval to 64 bit integer. * * Revision 1.7  1996/03/05 14:09:20  robertj * Fixed bugs in PTimerInterval stream output. * * Revision 1.6  1996/03/04 12:21:42  robertj * Fixed output of leading zeros in PTimeInterval stream output. * * Revision 1.5  1996/02/25 11:22:13  robertj * Added check for precision field in stream when outputting time interval.. * * Revision 1.4  1996/02/25 03:07:47  robertj * Changed PrintOn and ReadFrom on PTimeInterval to use dd:hh:mm:ss.mmm format. * * Revision 1.3  1996/02/15 14:47:35  robertj * Fixed bugs in time zone compensation (some in the C library). * * Revision 1.2  1996/02/13 12:59:32  robertj * Changed GetTimeZone() so can specify standard/daylight time. * Split PTime into separate module after major change to ReadFrom(). * * Revision 1.1  1996/02/13 10:11:52  robertj * Initial revision * */#include <ptlib.h>#include <ctype.h>///////////////////////////////////////////////////////////////////////////////// PTimeIntervalPTimeInterval::PTimeInterval(long millisecs,                             long seconds,                             long minutes,                             long hours,                             int days){  SetInterval(millisecs, seconds, minutes, hours, days);}PTimeInterval::PTimeInterval(const PString & str){  PStringStream strm(str);  ReadFrom(strm);}PObject::Comparison PTimeInterval::Compare(const PObject & obj) const{  PAssert(obj.IsDescendant(PTimeInterval::Class()), PInvalidCast);  const PTimeInterval & other = (const PTimeInterval &)obj;  return milliseconds < other.milliseconds ? LessThan :         milliseconds > other.milliseconds ? GreaterThan : EqualTo;}void PTimeInterval::PrintOn(ostream & stream) const{  int width = stream.width();  int precision = stream.precision();  if (precision > 3)    precision = 3;  BOOL hadPrevious = FALSE;  long tmp;  PStringStream str;  str.fill('0');  PInt64 ms = milliseconds;  if (ms < 0) {    str << '-';    ms = -ms;  }  if (precision < 0) {    precision = -precision;    if (precision > 3)      precision = 3;    tmp = (long)(ms/86400000);    if (tmp > 0 || width > (precision+10)) {      str << tmp << 'd';      hadPrevious = TRUE;    }    tmp = (long)(ms%86400000)/3600000;  }  else    tmp = (long)(ms/3600000);  if (hadPrevious || tmp > 0 || width > (precision+7)) {    if (hadPrevious)      str.width(2);    str << tmp << ':';    hadPrevious = TRUE;  }  tmp = (long)(ms%3600000)/60000;  if (hadPrevious || tmp > 0 || width > (precision+4)) {    if (hadPrevious)      str.width(2);    str << tmp << ':';    hadPrevious = TRUE;  }  if (hadPrevious)    str.width(2);  str << (long)(ms%60000)/1000;  switch (precision) {    case 1 :      str << '.' << (int)(ms%1000)/100;      break;    case 2 :      str << '.' << setw(2) << (int)(ms%1000)/10;      break;    case 3 :      str << '.' << setw(3) << (int)(ms%1000);    default :      break;  }  stream << str;}void PTimeInterval::ReadFrom(istream &strm){  long day = 0;  long hour = 0;  long min = 0;  float sec;  strm >> sec;  while (strm.peek() == ':') {    day = hour;    hour = min;    min = (long)sec;    strm.get();    strm >> sec;  }  SetInterval(((long)(sec*1000))%1000, (int)sec, min, hour, day);}void PTimeInterval::SetInterval(PInt64 millisecs,                                long seconds,                                long minutes,                                long hours,                                int days){  milliseconds = days;  milliseconds *= 24;  milliseconds += hours;  milliseconds *= 60;  milliseconds += minutes;  milliseconds *= 60;  milliseconds += seconds;  milliseconds *= 1000;  milliseconds += millisecs;}///////////////////////////////////////////////////////////////////////////////// PTimestatic time_t p_mktime(struct tm * t, int zone){  // mktime returns GMT, calculated using input_time - timezone. However, this  // assumes that the input time was a local time. If the input time wasn't a  // local time, then we have have to add the local timezone (without daylight  // savings) and subtract the specified zone offset to get GMT  // and then subtract  t->tm_isdst = PTime::IsDaylightSavings() ? 1 : 0;  time_t theTime = mktime(t);  if (theTime == (time_t)-1)    theTime = 0;  else if (zone != PTime::Local) {    theTime += PTime::GetTimeZone()*60;  // convert to local time    if (theTime > zone*60)      theTime -= zone*60;           // and then to GMT  }  return theTime;}PTime::PTime(const PString & str){  PStringStream s(str);  ReadFrom(s);}PTime::PTime(int second, int minute, int hour,             int day,    int month,  int year,             int zone){  microseconds = 0;  struct tm t;  PAssert(second >= 0 && second <= 59, PInvalidParameter);  t.tm_sec = second;  PAssert(minute >= 0 && minute <= 59, PInvalidParameter);  t.tm_min = minute;  PAssert(hour >= 0 && hour <= 23, PInvalidParameter);  t.tm_hour = hour;  PAssert(day >= 1 && day <= 31, PInvalidParameter);  t.tm_mday = day;  PAssert(month >= 1 && month <= 12, PInvalidParameter);  t.tm_mon = month-1;  PAssert(year >= 1970 && year <= 2038, PInvalidParameter);  t.tm_year   = year-1900;  theTime = p_mktime(&t, zone);}PObject::Comparison PTime::Compare(const PObject & obj) const{  PAssert(obj.IsDescendant(PTime::Class()), PInvalidCast);  const PTime & other = (const PTime &)obj;  if (theTime < other.theTime)    return LessThan;  if (theTime > other.theTime)    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 == RFC1123)    return AsString("wwwe, dd MMME yyyy hh:mm:ss z", zone);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -