Qt Virtual Chart Table (QVCT)
CUnitDate.cpp
Go to the documentation of this file.
1 // INDENTING (emacs/vi): -*- mode:c++; tab-width:2; c-basic-offset:2; intent-tabs-mode:nil; -*- ex: set tabstop=2 expandtab:
2 
3 /*
4  * Qt Virtual Chart Table (QVCT)
5  * Copyright (C) 2012 Cedric Dufour <http://cedric.dufour.name>
6  * Author: Cedric Dufour <http://cedric.dufour.name>
7  *
8  * The Qt Virtual Chart Table (QVCT) is free software:
9  * you can redistribute it and/or modify it under the terms of the GNU General
10  * Public License as published by the Free Software Foundation, Version 3.
11  *
12  * The Qt Virtual Chart Table (QVCT) is distributed in the hope
13  * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
14  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15  *
16  * See the GNU General Public License for more details.
17  */
18 
19 // C/C++
20 #include <cmath>
21 
22 // QT
23 #include <QDateTime>
24 #include <QMap>
25 #include <QRegExp>
26 #include <QString>
27 #include <QDate>
28 
29 // QVCT
30 #include "QVCTRuntime.hpp"
31 #include "units/CUnitDate.hpp"
32 
33 
34 //------------------------------------------------------------------------------
35 // CONSTANTS / STATIC
36 //------------------------------------------------------------------------------
37 
40 
41 const QMap<CUnitDate::EUnit,QString> &CUnitDate::symbols()
42 {
44 }
45 
47 {
48  return oUnitDateSymbols.qMapSymbols.value( _eUnit, "?" );
49 }
50 
51 CUnitDate::EUnit CUnitDate::fromSymbol( const QString& _rqString )
52 {
53  return oUnitDateSymbols.qMapSymbols.key( _rqString, UNDEFINED );
54 }
55 
56 const QMap<CUnitDate::EUnit,QString> &CUnitDate::codes()
57 {
59 }
60 
62 {
63  return oUnitDateCodes.qMapCodes.value( _eUnit, "undef" );
64 }
65 
66 CUnitDate::EUnit CUnitDate::fromCode( const QString& _rqString )
67 {
68  return oUnitDateCodes.qMapCodes.key( _rqString, UNDEFINED );
69 }
70 
71 QString CUnitDate::toString( double _fdValue, CUnitTimeZone::EUnit _eUnitTimeZone, CUnitDate::EUnit _eUnit )
72 {
73  QDateTime __qDateTime = QDateTime::fromTime_t( _fdValue );
74  QDate __qDate = _eUnitTimeZone == CUnitTimeZone::UTC ? __qDateTime.toUTC().date() : __qDateTime.toLocalTime().date();
75  switch( _eUnit )
76  {
77 
78  case YMD:
79  return __qDate.toString( "yyyy-MM-dd" );
80 
81  case DMY:
82  return __qDate.toString( "dd.MM.yyyy" );
83 
84  case MDY:
85  return __qDate.toString( "MM,dd,yyyy" );
86 
87  default: return "?";
88  }
89 }
90 
91 QString CUnitDate::toString( double _fdValue, bool _bAlternateTimeZone )
92 {
93  CSettings* __poSettings = QVCTRuntime::useSettings();
94  CUnitTimeZone::EUnit __eUnitTimeZone = __poSettings->getUnitTimeZone();
95  if( _bAlternateTimeZone ) __eUnitTimeZone = ( __eUnitTimeZone == CUnitTimeZone::UTC ) ? CUnitTimeZone::LOCAL : CUnitTimeZone::UTC;
96  return toString( _fdValue, __eUnitTimeZone, __poSettings->getUnitDate() );
97 }
98 
99 double CUnitDate::fromString( const QString& _rqString, CUnitTimeZone::EUnit _eUnitTimeZone, bool* _pbOK )
100 {
101  static const QRegExp __qRegExpYMD( "^\\s*(197\\d|19[89]\\d|[2-9]\\d\\d\\d)-(0?[1-9]|1[12])-(0?[1-9]|[12]\\d|3[01])\\s*([ZzLl])?\\s*$" );
102  static const QRegExp __qRegExpDMY( "^\\s*(0?[1-9]|[12]\\d|3[01]).(0?[1-9]|1[12]).(197\\d|19[89]\\d|[2-9]\\d\\d\\d)\\s*([ZzLl])?\\s*$" );
103  static const QRegExp __qRegExpMDY( "^\\s*(0?[1-9]|1[12]),(0?[1-9]|[12]\\d|3[01]),(197\\d|19[89]\\d|[2-9]\\d\\d\\d)\\s*([ZzLl])?\\s*$" );
104 
105  if( _pbOK ) *_pbOK = false;
106  QDateTime __qDateTime;
107  if( __qRegExpYMD.exactMatch( _rqString ) )
108  {
109  CUnitTimeZone::EUnit __eUnitTimeZone = _eUnitTimeZone;
110  QString __qsTimeZone = __qRegExpYMD.cap(4).toUpper();
111  if( __qsTimeZone == "Z" ) __eUnitTimeZone = CUnitTimeZone::UTC;
112  else if( __qsTimeZone == "L" ) __eUnitTimeZone = CUnitTimeZone::LOCAL;
113  __qDateTime.setTimeSpec( __eUnitTimeZone == CUnitTimeZone::UTC ? Qt::UTC : Qt::LocalTime );
114  __qDateTime.setDate( QDate( __qRegExpYMD.cap(1).toInt(), __qRegExpYMD.cap(2).toInt(), __qRegExpYMD.cap(3).toInt() ) );
115  }
116  else if( __qRegExpDMY.exactMatch( _rqString ) )
117  {
118  CUnitTimeZone::EUnit __eUnitTimeZone = _eUnitTimeZone;
119  QString __qsTimeZone = __qRegExpDMY.cap(4).toUpper();
120  if( __qsTimeZone == "Z" ) __eUnitTimeZone = CUnitTimeZone::UTC;
121  else if( __qsTimeZone == "L" ) __eUnitTimeZone = CUnitTimeZone::LOCAL;
122  __qDateTime.setTimeSpec( __eUnitTimeZone == CUnitTimeZone::UTC ? Qt::UTC : Qt::LocalTime );
123  __qDateTime.setDate( QDate( __qRegExpDMY.cap(3).toInt(), __qRegExpDMY.cap(2).toInt(), __qRegExpDMY.cap(1).toInt() ) );
124  }
125  else if( __qRegExpMDY.exactMatch( _rqString ) )
126  {
127  CUnitTimeZone::EUnit __eUnitTimeZone = _eUnitTimeZone;
128  QString __qsTimeZone = __qRegExpMDY.cap(4).toUpper();
129  if( __qsTimeZone == "Z" ) __eUnitTimeZone = CUnitTimeZone::UTC;
130  else if( __qsTimeZone == "L" ) __eUnitTimeZone = CUnitTimeZone::LOCAL;
131  __qDateTime.setTimeSpec( __eUnitTimeZone == CUnitTimeZone::UTC ? Qt::UTC : Qt::LocalTime );
132  __qDateTime.setDate( QDate( __qRegExpMDY.cap(3).toInt(), __qRegExpMDY.cap(1).toInt(), __qRegExpMDY.cap(2).toInt() ) );
133  }
134  else return 0.0;
135  if( _pbOK ) *_pbOK = true;
136  return( (double)__qDateTime.toTime_t() );
137 }
138 
139 double CUnitDate::fromString( const QString& _rqString, bool* _pbOK )
140 {
141  CSettings* __poSettings = QVCTRuntime::useSettings();
142  return fromString( _rqString, __poSettings->getUnitTimeZone(), _pbOK );
143 }
[UI] Container for the application's settings
Definition: CSettings.hpp:51
CUnitDate::EUnit getUnitDate()
[Unit] Returns the date format/unit
Definition: CSettings.hpp:339
CUnitTimeZone::EUnit getUnitTimeZone()
[Unit] Returns the timezone format/unit
Definition: CSettings.hpp:345
Container class for supported machine-friendly format/unit codes.
Definition: CUnitDate.hpp:114
QMap< CUnitDate::EUnit, QString > qMapCodes
Definition: CUnitDate.hpp:127
Container class for supported human-readable format/unit symbols.
Definition: CUnitDate.hpp:95
QMap< CUnitDate::EUnit, QString > qMapSymbols
Definition: CUnitDate.hpp:108
static EUnit fromCode(const QString &_rqsCode)
Returns the format/unit ID corresponding to the given machine-friendly code.
Definition: CUnitDate.cpp:66
static const CUnitDateCodes oUnitDateCodes
Container for supported machine-friendly format/unit codes.
Definition: CUnitDate.hpp:58
static const QMap< EUnit, QString > & symbols()
Returns the list of supported human-readable format/unit symbols.
Definition: CUnitDate.cpp:41
static const CUnitDateSymbols oUnitDateSymbols
Container for supported human-readable format/unit symbols.
Definition: CUnitDate.hpp:56
static const QMap< EUnit, QString > & codes()
Returns the list of supported machine-friendly format/unit codes.
Definition: CUnitDate.cpp:56
static QString toString(double _fdValue, CUnitTimeZone::EUnit _eUnitTimeZone, EUnit _eUnit)
Returns the formatted represention of the given value, using the specified format/unit and decimal pr...
Definition: CUnitDate.cpp:71
static double fromString(const QString &_rqString, CUnitTimeZone::EUnit _eUnitTimeZone, bool *_pbOK=0)
Returns the numeric value corresponding (parsed) from the string.
Definition: CUnitDate.cpp:99
EUnit
Format/unit ID.
Definition: CUnitDate.hpp:47
@ MDY
MM-DD-YYYY.
Definition: CUnitDate.hpp:50
@ UNDEFINED
undefined format/unit
Definition: CUnitDate.hpp:51
@ YMD
YYYY-MM-DD.
Definition: CUnitDate.hpp:48
@ DMY
DD-MM-YYYY.
Definition: CUnitDate.hpp:49
static QString toSymbol(EUnit _eUnit)
Returns the human-readable symbol corresponding to the given format/unit ID.
Definition: CUnitDate.cpp:46
static EUnit fromSymbol(const QString &_rqsSymbol)
Returns the format/unit ID corresponding to the given human-readable symbol.
Definition: CUnitDate.cpp:51
static QString toCode(EUnit _eUnit)
Returns the machine-friendly code corresponding to the given format/unit ID.
Definition: CUnitDate.cpp:61
EUnit
Format/unit ID.
@ LOCAL
Local Time.
@ UTC
Universal Time Coordinates.
static CSettings * useSettings()