01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:

/*
* Copyright (c), Zeriph Enterprises
* All rights reserved.
*
* Contributor(s):
* Zechariah Perez, omni (at) zeriph (dot) com
*
* THIS SOFTWARE IS PROVIDED BY ZERIPH AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL ZERIPH AND CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES
* LOSS OF USE, DATA, OR PROFITS OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#if !defined(OMNI_DATE_DEF_HPP)
#define OMNI_DATE_DEF_HPP 1
#include <omni/defs/global.hpp>
#include <omni/string/util.hpp>
#include <omni/types/string_t.hpp>
#include <omni/types/tick_t.hpp>
#define OMNI_DATE_PART_YEAR_FW 0
#define OMNI_DATE_PART_DAY_OF_YEAR_FW 1
#define OMNI_DATE_PART_MONTH_FW 2
#define OMNI_DATE_PART_DAY_FW 3
#define OMNI_DATE_FLAGS_MASK_FW 0xC000000000000000
#define OMNI_DATE_LOCAL_MASK_FW 0x8000000000000000
#define OMNI_DATE_KIND_UNSPECIFIED_FW 0x0000000000000000
#define OMNI_DATE_KIND_UTC_FW 0x4000000000000000
#define OMNI_DATE_KIND_LOCAL_FW 0x8000000000000000
#define OMNI_DATE_KIND_LOCAL_DST_FW 0xC000000000000000
#define OMNI_DATE_KIND_SHIFT_FW 62
#define OMNI_DATE_TWO_DIGIT_YEAR_MAX 30
#define OMNI_DATE_MAX_YEAR 9999
#define OMNI_DAYS_PER_YEAR 365 // non-leap
#define OMNI_DAYS_PER_LEAP_YEAR 366
#define OMNI_DAYS_PER_4_YEARS 1461 // 365 * 4 + 1 leap day
// DEV_NOTE: from https://www.grc.nasa.gov/www/k-12/Numbers/Math/Mathematical_Thinking/calendar_calculations.htm
#define OMNI_DAYS_PER_TROPICAL_YEAR 365.2422
// DEV_NOTE: These values are to keep in line with the .NET library
#define OMNI_DAYS_PER_100_YEARS 36524 // DAYS_PER_4_YEARS * 25 - 1
#define OMNI_DAYS_PER_400_YEARS 146097 // DAYS_PER_100_YEARS * 4 + 1
#define OMNI_DAYS_TO_1601AD 584388 // Number of days from 1/1/0001 to 12/31/1600 -> DAYS_PER_400_YEARS * 4
#define OMNI_DAYS_TO_1899AD 693593 // Number of days from 1/1/0001 to 12/30/1899 -> DAYS_PER_400_YEARS * 4 + DAYS_PER_100_YEARS * 3 - 367;
#define OMNI_DAYS_TO_1970AD 719162 // Number of days from 1/1/0001 to 12/31/1969 -> DAYS_PER_400_YEARS * 4 + DAYS_PER_100_YEARS * 3 + OMNI_DAYS_PER_4_YEARS * 17 + OMNI_DAYS_PER_YEAR
#define OMNI_DAYS_TO_EPOCH OMNI_DAYS_TO_1970AD
#define OMNI_DAYS_TO_10000AD 3652059 // Number of days from 1/1/0001 to 12/31/9999 -> DAYS_PER_400_YEARS * 25 - 366
#define OMNI_TICKS_TO_10000AD 3155378975999999999 // DAYS_TO_10000AD * TICKS_PER_DAY - 1;
#define OMNI_MILLISECONDS_TO_10000AD 315537897600000 // DAYS_TO_10000AD * MILLISECONDS_PER_DAY;
#define OMNI_FILE_TIME_OFFSET 504911232000000000 // DAYS_TO_1601AD * TICKS_PER_DAY;
#define OMNI_DOUBLE_DATE_OFFSET 599264352000000000 // DAYS_TO_1899AD * TICKS_PER_DAY;
#define OMNI_EPOCH_OFFSET 621355968000000000 // DAYS_TO_EPOCH * TICKS_PER_DAY;
#define OMNI_UNIX_EPOCH_TICKS 621355968000000000 // OMNI_TICKS_PER_DAY * OMNI_DAYS_TO_1970AD
#define OMNI_UNIX_EPOCH_SECONDS 62135596800 // OMNI_UNIX_EPOCH_TICKS / OMNI_TICKS_PER_SECOND
#define OMNI_UNIX_EPOCH_MILLISECONDS 62135596800000 // OMNI_UNIX_EPOCH_TICKS / OMNI_TICKS_PER_MILLISECOND
// The minimum OA date is 0100/01/01 (Note it is year 100).
// The maximum OA date is 9999/12/31
#define OMNI_OA_DATE_MIN_AS_TICKS 31241376000000000 // (DAYS_PER_100_YEARS - DAYS_PER_YEAR) * TICKS_PER_DAY;
#define OMNI_OA_DATE_MIN_AS_DOUBLE -657435.0 // All OA dates must be greater than (not >=) OA_DATE_MIN_AS_DOUBLE
#define OMNI_OA_DATE_MAX_AS_DOUBLE 2958466.0 // All OA dates must be less than (not <=) OA_DATE_MAX_AS_DOUBLE
#define OMNI_DAYS_TO_MONTH_365 { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }
#define OMNI_DAYS_TO_MONTH_366 { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
#endif // OMNI_DATE_DEF_HPP