mirror of
https://github.com/boostorg/date_time.git
synced 2026-07-22 13:23:37 +00:00
Compare commits
425 Commits
boost-1.43.0
...
develop
| Author | SHA1 | Date | |
|---|---|---|---|
| 6248d64ed9 | |||
| 6b387c4969 | |||
| 69c45b7a2b | |||
| 19ffa6232d | |||
| 363e04d7ec | |||
| 64c1df1e3e | |||
| 645574e5df | |||
| 85e637cb32 | |||
| 39714907b7 | |||
| abef5a147a | |||
| ddcfd00391 | |||
| c02d713cef | |||
| b81ed2874f | |||
| 0aed920bfb | |||
| f972dc9656 | |||
| 7677fdce5a | |||
| 8729945096 | |||
| cbad9bcec9 | |||
| 64fe6586fe | |||
| a20a5c8b7c | |||
| ff77162265 | |||
| 0be5d92c90 | |||
| 33dc6136f1 | |||
| 7156392706 | |||
| 561ccb878d | |||
| 3feaece6d2 | |||
| 9970590094 | |||
| 4b97311ca7 | |||
| a94bcf288d | |||
| 8011fdf0bc | |||
| 15be01a02d | |||
| acbee0dc6a | |||
| aa9c5dfd48 | |||
| 47de78e4fc | |||
| 79ca1aa0a7 | |||
| ccc21804bd | |||
| 31c983b256 | |||
| f92b2b3bfc | |||
| b43d605ad2 | |||
| fa46e55ca8 | |||
| 61677ba228 | |||
| 30795441e4 | |||
| 77495803c1 | |||
| 247424d08d | |||
| ab066e3601 | |||
| 76852e4aab | |||
| 356c5c2600 | |||
| 3d55c15cbb | |||
| d77ee59bc2 | |||
| 5093074e0e | |||
| ecf042f538 | |||
| d0b3c1da88 | |||
| b03272650e | |||
| e9a9ce3e35 | |||
| 0c1d8fddd8 | |||
| ad3239b722 | |||
| d335a54e9f | |||
| cb3bd50b90 | |||
| 4a46476358 | |||
| 44618f1632 | |||
| bbac2178ed | |||
| d8c7a59ed9 | |||
| d8a894c44a | |||
| 139f44776d | |||
| 6f7b2b5056 | |||
| 4e1b7cde45 | |||
| e26fd2ed98 | |||
| 061aec856d | |||
| 1a95e81043 | |||
| c0b71da135 | |||
| 2fabfad443 | |||
| 3cc68a4642 | |||
| 29bb209464 | |||
| 345abc6b67 | |||
| b0437e2999 | |||
| 5902a0e577 | |||
| c18805c4ba | |||
| 81d60863b6 | |||
| a3d61f0d30 | |||
| dc5ce19c27 | |||
| 66ee8bf48f | |||
| aa19739c55 | |||
| f76ef169a0 | |||
| fd5f9aea7c | |||
| 6875e73a03 | |||
| 8e1f2be360 | |||
| 1838518b41 | |||
| a7ec0146c7 | |||
| 9690a13c55 | |||
| 5a70608c65 | |||
| dae0fa1b47 | |||
| 3f092da750 | |||
| 960c959f10 | |||
| 1a2700d527 | |||
| 8b92513a94 | |||
| d8a1ed32fb | |||
| 313c1a38f8 | |||
| e0da18162a | |||
| f35bbbe906 | |||
| f280794280 | |||
| 18b6ca8160 | |||
| b1193100b0 | |||
| e78132c031 | |||
| e4379f752e | |||
| d0aec34055 | |||
| 3c794d085a | |||
| 00ab3d7226 | |||
| 6e3761271d | |||
| 2bf11e74a2 | |||
| 53d5131244 | |||
| 73178412b0 | |||
| 2e4a3010f0 | |||
| de171954fe | |||
| 1a931e2f5e | |||
| f302689484 | |||
| f9f2aaf521 | |||
| af8832799f | |||
| e87b7120ac | |||
| 5d94c6d65d | |||
| 313ba3be94 | |||
| 91e931cbc7 | |||
| 484c28d442 | |||
| 78e7772ad5 | |||
| b3b6ddd5ba | |||
| 2f616517b5 | |||
| f6ab5fc0fd | |||
| afa1a44f97 | |||
| 53da52ee05 | |||
| 2434bc8f4d | |||
| f983eef46b | |||
| dcab4d2bfa | |||
| 3a5f651c30 | |||
| 26249ccbc0 | |||
| 405e66e7e7 | |||
| 5f2d1fad55 | |||
| 805b89d987 | |||
| d9b355d2c2 | |||
| e86cc2c4d5 | |||
| efa45ac4ed | |||
| da6038df30 | |||
| 313ad06704 | |||
| 8e2a8fdcb2 | |||
| 266e6cc8e1 | |||
| b3a1f75376 | |||
| e9ddfa6400 | |||
| 1e844a3143 | |||
| e46fda1c9e | |||
| e67bf74ac6 | |||
| 6b3452954e | |||
| 587a677ebc | |||
| d3986cf902 | |||
| 82f61328b2 | |||
| cbcb9923e7 | |||
| d972d0cd69 | |||
| 7cf4f75e74 | |||
| 6af6215e9e | |||
| 2f1b24518e | |||
| 729af79cc5 | |||
| 24d297ba79 | |||
| 8cc821fa9b | |||
| 5459990493 | |||
| 786b9eb948 | |||
| 5974bdcbb9 | |||
| 4e31167489 | |||
| b1dc2b306e | |||
| 8c85874006 | |||
| 1388380be8 | |||
| 8e299776fa | |||
| f690b29348 | |||
| 818dea52f3 | |||
| 9817537a2c | |||
| 47cf10d5fd | |||
| 1e71530fb4 | |||
| 51659e3404 | |||
| 22a3727798 | |||
| ef8fa5b5d5 | |||
| 8e45258f00 | |||
| e6050c81e6 | |||
| f4c2ca351b | |||
| 6015e30391 | |||
| ee4ceddc52 | |||
| d20ad3083e | |||
| e37ce12d57 | |||
| 6cad962159 | |||
| a742fcbffd | |||
| 9fbd8db5c9 | |||
| bd3973017c | |||
| 73de7bc29f | |||
| d7673dddb9 | |||
| 03c419d8b6 | |||
| 350dc3342d | |||
| d5041e7075 | |||
| 6d09aabddc | |||
| 75176687d7 | |||
| 1519c8784e | |||
| 86703c4df9 | |||
| 75d979c03a | |||
| f1f27d9a55 | |||
| b13b2a2b42 | |||
| ca30f6a01e | |||
| 2c3a8b21b9 | |||
| 7002518d0f | |||
| 79ea55aae4 | |||
| e9c5af3c45 | |||
| b43dd52cdc | |||
| e4f4a89339 | |||
| f1f69e1c78 | |||
| ae536816ee | |||
| 6cc1cb5ae5 | |||
| 805bf4dffe | |||
| 1753a38289 | |||
| a403bdac5b | |||
| 6636f49f13 | |||
| 98d1ae6536 | |||
| 23f7406095 | |||
| 2df204ba78 | |||
| 6f82742918 | |||
| c32726ec7e | |||
| 9ad0419530 | |||
| ffe85c7d4b | |||
| 21a29b977b | |||
| ef81faff5f | |||
| 4d44fae9ac | |||
| f9d548ae92 | |||
| f42e7f6287 | |||
| c4abfc8cbb | |||
| 344c0dceb4 | |||
| 30e7e7ae46 | |||
| c88efdea68 | |||
| ad1899abd9 | |||
| 057e0aaf64 | |||
| 072b4e1b61 | |||
| fe1f823e3a | |||
| dee09f0e62 | |||
| af581a1f2a | |||
| 71ccdd2fe5 | |||
| d123f62bdc | |||
| 98f041d7fd | |||
| 990187b70c | |||
| 0054ff1ab7 | |||
| 0764743fb9 | |||
| 250b88cfb5 | |||
| d9874a3140 | |||
| 47c81a9033 | |||
| 5e009f6002 | |||
| 9454bb4e1c | |||
| 5126bfbc0a | |||
| 6bbd9f50bc | |||
| 98bbc0b95c | |||
| 29c0f85c14 | |||
| 11974f29b2 | |||
| 365c29f1a1 | |||
| 2e31c3b92e | |||
| db1f46894e | |||
| 318a6ce7ea | |||
| 2da515b579 | |||
| e86d5f310f | |||
| 7ce2128b11 | |||
| 4a5c1d20a3 | |||
| 7b1b5aa452 | |||
| 693c89198f | |||
| 006adfaa84 | |||
| 2dd066d92c | |||
| f0381aab02 | |||
| 9b94605972 | |||
| e6515ce73c | |||
| a6bca8a4a5 | |||
| 97c2acd867 | |||
| c2861c6305 | |||
| 75c53e7b75 | |||
| 2490f1c985 | |||
| c81a7f7f0c | |||
| 7f89ef42b6 | |||
| 72eb4479ea | |||
| 77d6aa82bb | |||
| dbc9491a32 | |||
| bd7d632c66 | |||
| 2303ba2fbc | |||
| 0872610990 | |||
| e5ccaeb9e8 | |||
| a77b19d9d7 | |||
| 1e00a75273 | |||
| 9bb7d42086 | |||
| 88c18beb87 | |||
| 7052c3c5f7 | |||
| abdd3169e4 | |||
| f049671aa3 | |||
| 20286c8d74 | |||
| 6baaaaf783 | |||
| 6d73f377d3 | |||
| 2f18c57465 | |||
| 39fc9958ce | |||
| 2869d0f722 | |||
| 6b7e271ba8 | |||
| 7f0f89d624 | |||
| b498fbdd1b | |||
| bc68ffd15b | |||
| a856c75856 | |||
| 5c9a890972 | |||
| d444c164c2 | |||
| e524b7b26b | |||
| a161660022 | |||
| df5886f64e | |||
| 2c8be13241 | |||
| 85d61ef073 | |||
| 80ffd14c8c | |||
| aa1b72b62a | |||
| 836b5faa3e | |||
| e8561914b1 | |||
| 4e56397de2 | |||
| 116869304c | |||
| 565d7d13a8 | |||
| 4db9fc1777 | |||
| 3a779defdb | |||
| 5bad0e79de | |||
| a3e84e42be | |||
| 2cf2957cd5 | |||
| 901cb1fd20 | |||
| b85f86f35e | |||
| 3fce52f4e3 | |||
| 73e55ee157 | |||
| 09b0c7c183 | |||
| 0255dcd796 | |||
| 4558ebe892 | |||
| 9be8ef4831 | |||
| 4ebe9e7979 | |||
| 820a0b311f | |||
| e229437b9e | |||
| fa0df44386 | |||
| 84ae903714 | |||
| 525b5dcf4c | |||
| 87dab33026 | |||
| f985c62668 | |||
| b0d4735d98 | |||
| 024f7bb976 | |||
| 7f908f13d9 | |||
| 0970985b80 | |||
| ec094bd865 | |||
| 72e2a74cb9 | |||
| ee7665b716 | |||
| 3e558911e4 | |||
| 8e9f05161d | |||
| d1877bf9de | |||
| 02b34018f4 | |||
| 34e2312fa5 | |||
| 49fe4d03ff | |||
| 8a5d48f39c | |||
| e0efb39092 | |||
| acc5739dbd | |||
| 4812f46d4e | |||
| 15c4ebd523 | |||
| 5ac35edc3a | |||
| 854864f008 | |||
| 45512be109 | |||
| 4a238482e8 | |||
| 462d59604b | |||
| 4ea026b835 | |||
| 415b9adb49 | |||
| 33fb3ebfe0 | |||
| f518db10a5 | |||
| e3fcd06a86 | |||
| 58f4e4bbd7 | |||
| 841625c1ac | |||
| 334b57e8d9 | |||
| 4bc6196a71 | |||
| e68bd489a6 | |||
| ac3a5b489a | |||
| ca3bb2dfe8 | |||
| 1dd61b0f86 | |||
| f15712c448 | |||
| b59c3dab04 | |||
| fe220e57b3 | |||
| aa74081aff | |||
| d170c71007 | |||
| 7c851f60d3 | |||
| 6c6a6b3a1c | |||
| 19cdab0cd5 | |||
| 7c5395ddad | |||
| 2ff01baa21 | |||
| e6bb691886 | |||
| aebbc1c144 | |||
| 48a959accb | |||
| 6cfc268a27 | |||
| 342e17aa5a | |||
| 890e8ed154 | |||
| 9a267135c1 | |||
| 9b5d99078e | |||
| 1629ac31d0 | |||
| a9c191bb59 | |||
| 957b7ae81c | |||
| c72177cb58 | |||
| b04e84c09c | |||
| 43f9e6bc25 | |||
| 7171662c11 | |||
| 1cbafb20d0 | |||
| 908a40bdc1 | |||
| ff8d2cf762 | |||
| 387f8b7bf6 | |||
| 9586e247ac | |||
| 2a19fc5fb0 | |||
| 998143109f | |||
| 461e80afd6 | |||
| b232691602 | |||
| f504c68f58 | |||
| 3dba864d34 | |||
| 5becc5c309 | |||
| 0ed19eeb72 | |||
| 53042733a8 | |||
| bf9502ac86 | |||
| 325834a1d7 | |||
| 4288e5fc08 | |||
| ed1cb467d0 | |||
| 53030e4527 | |||
| 627693d12d | |||
| 17b02e954c | |||
| 0dadfe419a | |||
| 963cb4d5c8 | |||
| 2f8e311836 | |||
| abee080986 | |||
| e9752ce604 | |||
| 2d22341ee6 | |||
| 269f799e99 | |||
| bd25005368 | |||
| 2af5cd1361 | |||
| 6d728ddd40 |
+116
@@ -0,0 +1,116 @@
|
||||
# Copyright 2016, 2017 Peter Dimov
|
||||
# Copyright 2017 - 2019 James E. King III
|
||||
# Copyright 2019 - 2021 Alexander Grund
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#
|
||||
# Generic Appveyor build script for boostorg repositories
|
||||
# See: https://github.com/boostorg/boost-ci/
|
||||
#
|
||||
# Instructions for customizing this script for your library:
|
||||
#
|
||||
# 1. Customize the compilers and language levels you want.
|
||||
# 2. If you have more than include/, src/, test/, example/, examples/,
|
||||
# benchmark/ or tools/ directories, set the environment variable DEPINST.
|
||||
# For example if your build uses code in "bench/" and "fog/" directories:
|
||||
# - DEPINST: --include bench --include fog
|
||||
# 3. Enable pull request builds in your boostorg/<library> account.
|
||||
#
|
||||
# That's it - the script will do everything else for you.
|
||||
#
|
||||
|
||||
version: 1.0.{build}-{branch}
|
||||
|
||||
shallow_clone: true
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- develop
|
||||
- /bugfix\/.*/
|
||||
- /feature\/.*/
|
||||
- /fix\/.*/
|
||||
- /pr\/.*/
|
||||
|
||||
matrix:
|
||||
fast_finish: false
|
||||
# Adding MAYFAIL to any matrix job allows it to fail but the build stays green:
|
||||
allow_failures:
|
||||
- MAYFAIL: true
|
||||
|
||||
environment:
|
||||
global:
|
||||
B2_CI_VERSION: 1
|
||||
GIT_FETCH_JOBS: 4
|
||||
# see: http://www.boost.org/build/doc/html/bbv2/overview/invocation.html#bbv2.overview.invocation.properties
|
||||
# to use the default for a given environment, comment it out; recommend you build debug and release however:
|
||||
# on Windows it is important to exercise all the possibilities, especially shared vs static, however most
|
||||
# libraries that care about this exercise it in their Jamfiles...
|
||||
B2_ADDRESS_MODEL: 32,64
|
||||
B2_LINK: shared,static
|
||||
# B2_THREADING: threading=multi,single
|
||||
B2_VARIANT: release
|
||||
BOOST_DATE_TIME_TEST_WITHOUT_SELF_CONTAINED_HEADER_TESTS: 1
|
||||
|
||||
matrix:
|
||||
- FLAVOR: Visual Studio 2017 C++2a Strict
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||
B2_CXXFLAGS: -permissive-
|
||||
B2_CXXSTD: 2a
|
||||
B2_TOOLSET: msvc-14.1
|
||||
|
||||
- FLAVOR: Visual Studio 2017 C++14/17
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||
B2_CXXSTD: 14,17
|
||||
B2_TOOLSET: msvc-14.1
|
||||
|
||||
- FLAVOR: clang-cl
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||
B2_ADDRESS_MODEL: 64
|
||||
B2_CXXSTD: 11,14,17
|
||||
B2_TOOLSET: clang-win
|
||||
|
||||
- FLAVOR: Visual Studio 2015, 2013
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
B2_TOOLSET: msvc-12.0,msvc-14.0
|
||||
|
||||
- FLAVOR: Visual Studio 2008, 2010, 2012
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
B2_TOOLSET: msvc-9.0,msvc-10.0,msvc-11.0
|
||||
B2_ADDRESS_MODEL: 32 # No 64bit support
|
||||
|
||||
- FLAVOR: cygwin (32-bit)
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||
ADDPATH: C:\cygwin\bin;
|
||||
B2_ADDRESS_MODEL: 32
|
||||
B2_CXXSTD: 03,11,14,1z
|
||||
B2_THREADING: threadapi=pthread
|
||||
B2_TOOLSET: gcc
|
||||
|
||||
- FLAVOR: cygwin (64-bit)
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||
ADDPATH: C:\cygwin64\bin;
|
||||
B2_ADDRESS_MODEL: 64
|
||||
B2_CXXSTD: 03,11,14,1z
|
||||
B2_THREADING: threadapi=pthread
|
||||
B2_TOOLSET: gcc
|
||||
|
||||
- FLAVOR: mingw64
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
|
||||
ADDPATH: C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;
|
||||
B2_ADDRESS_MODEL: 64
|
||||
B2_CXXSTD: 03,11,14,17,2a
|
||||
B2_TOOLSET: gcc
|
||||
|
||||
install:
|
||||
- git clone --depth 1 https://github.com/boostorg/boost-ci.git C:\boost-ci-cloned
|
||||
# Copy ci folder if not testing Boost.CI
|
||||
- if NOT "%APPVEYOR_PROJECT_NAME%" == "boost-ci" xcopy /s /e /q /i /y C:\boost-ci-cloned\ci .\ci
|
||||
- rmdir /s /q C:\boost-ci-cloned
|
||||
- ci\appveyor\install.bat
|
||||
|
||||
build: off
|
||||
|
||||
test_script: ci\build.bat
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
# Copyright 2019 - 2021 Alexander Grund
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
#
|
||||
# Sample codecov configuration file. Edit as required
|
||||
|
||||
codecov:
|
||||
max_report_age: off
|
||||
require_ci_to_pass: yes
|
||||
notify:
|
||||
# Increase this if you have multiple coverage collection jobs
|
||||
after_n_builds: 2
|
||||
wait_for_ci: yes
|
||||
|
||||
# Change how pull request comments look
|
||||
comment:
|
||||
layout: "reach,diff,flags,files,footer"
|
||||
|
||||
# Ignore specific files or folders. Glob patterns are supported.
|
||||
# See https://docs.codecov.com/docs/ignoring-paths
|
||||
ignore:
|
||||
- libs/date_time/test/
|
||||
- test
|
||||
@@ -0,0 +1,50 @@
|
||||
#
|
||||
# Copyright 2020-2021 Peter Dimov
|
||||
# Copyright 2021 Andrey Semashev
|
||||
# Copyright 2021-2024 Alexander Grund
|
||||
# Copyright 2022-2025 James E. King III
|
||||
#
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
#
|
||||
# This workflow uses the Boost.CI reusable workflow which builds a variety of
|
||||
# configurations of your project, runs tests, and generates code coverage reports.
|
||||
#
|
||||
# To use it, copy this file into your repository as `.github/workflows/ci.yml` and
|
||||
# customize it appropriately.
|
||||
#
|
||||
---
|
||||
name: Boost.CI
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
- bugfix/**
|
||||
- feature/**
|
||||
- fix/**
|
||||
- pr/**
|
||||
paths-ignore:
|
||||
- LICENSE
|
||||
- meta/**
|
||||
- README.md
|
||||
|
||||
jobs:
|
||||
call-boost-ci:
|
||||
name: Run Boost.CI
|
||||
uses: boostorg/boost-ci/.github/workflows/reusable.yml@master
|
||||
with:
|
||||
# no endian branches
|
||||
enable_multiarch: false
|
||||
# serialization has issues, not enough time to add suppressions
|
||||
enable_sanitizers: false
|
||||
# these compilers fail
|
||||
exclude_compiler: 'gcc-4.7,gcc-4.8,gcc-4.9,gcc-5,clang-3.5,clang-3.6,clang-3.7,clang-3.8'
|
||||
# the tests take a while; this reduces the load a bit and there isn't any C++20 specific code
|
||||
exclude_cxxstd: '98,03,0x,2a,20'
|
||||
secrets:
|
||||
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||
COVERITY_SCAN_NOTIFICATION_EMAIL: ${{ secrets.COVERITY_SCAN_NOTIFICATION_EMAIL }}
|
||||
COVERITY_SCAN_TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
|
||||
@@ -0,0 +1,2 @@
|
||||
**/test_facet_file.out
|
||||
**/time_duration_serialization.*
|
||||
@@ -0,0 +1,4 @@
|
||||
# https://github.com/boostorg/serialization/issues/122
|
||||
vptr:/usr/include/c++/*/bits/ios_base.h
|
||||
# https://github.com/boostorg/serialization/issues/193
|
||||
# could not figure out how to suppress it
|
||||
@@ -0,0 +1,52 @@
|
||||
# Generated by `boostdep --cmake date_time`
|
||||
# Copyright 2020 Peter Dimov
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
cmake_minimum_required(VERSION 3.5...3.16)
|
||||
|
||||
project(boost_date_time VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
|
||||
|
||||
add_library(boost_date_time
|
||||
src/gregorian/greg_month.cpp
|
||||
)
|
||||
|
||||
add_library(Boost::date_time ALIAS boost_date_time)
|
||||
|
||||
target_include_directories(boost_date_time PUBLIC include)
|
||||
|
||||
target_link_libraries(boost_date_time
|
||||
PUBLIC
|
||||
Boost::algorithm
|
||||
Boost::assert
|
||||
Boost::config
|
||||
Boost::core
|
||||
Boost::io
|
||||
Boost::lexical_cast
|
||||
Boost::numeric_conversion
|
||||
Boost::range
|
||||
Boost::smart_ptr
|
||||
Boost::throw_exception
|
||||
Boost::tokenizer
|
||||
Boost::type_traits
|
||||
Boost::utility
|
||||
Boost::winapi
|
||||
)
|
||||
|
||||
target_compile_definitions(boost_date_time
|
||||
PUBLIC BOOST_DATE_TIME_NO_LIB
|
||||
PRIVATE BOOST_DATE_TIME_SOURCE
|
||||
)
|
||||
|
||||
if(BUILD_SHARED_LIBS)
|
||||
target_compile_definitions(boost_date_time PUBLIC BOOST_DATE_TIME_DYN_LINK)
|
||||
else()
|
||||
target_compile_definitions(boost_date_time PUBLIC BOOST_DATE_TIME_STATIC_LINK)
|
||||
endif()
|
||||
|
||||
if(BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt")
|
||||
|
||||
add_subdirectory(test)
|
||||
|
||||
endif()
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
Boost Software License - Version 1.0 - August 17th, 2003
|
||||
|
||||
Permission is hereby granted, free of charge, to any person or organization
|
||||
obtaining a copy of the software and accompanying documentation covered by
|
||||
this license (the "Software") to use, reproduce, display, distribute,
|
||||
execute, and transmit the Software, and to prepare derivative works of the
|
||||
Software, and to permit third-parties to whom the Software is furnished to
|
||||
do so, all subject to the following:
|
||||
|
||||
The copyright notices in the Software and this entire statement, including
|
||||
the above license grant, this restriction and the following disclaimer,
|
||||
must be included in all copies of the Software, in whole or in part, and
|
||||
all derivative works of the Software, unless such copies or derivative
|
||||
works are solely in the form of machine-executable object code generated by
|
||||
a source language processor.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
@@ -0,0 +1,40 @@
|
||||
DateTime, part of the collection of [Boost C++ Libraries](http://github.com/boostorg), makes programming with dates and times as simple and natural as programming with strings and integers.
|
||||
|
||||
### License
|
||||
|
||||
Distributed under the [Boost Software License, Version 1.0](http://www.boost.org/LICENSE_1_0.txt).
|
||||
|
||||
### Properties
|
||||
|
||||
* C++11
|
||||
* Header only
|
||||
|
||||
### Build Status
|
||||
|
||||
<!-- boost-ci/tools/makebadges.sh --repo date_time --appveyorbadge upf5c528fy09fudk --codecovbadge nDoh7t8f6g --coverity 14908 -->
|
||||
| Branch | GHA CI | Appveyor | Coverity Scan | codecov.io | Deps | Docs | Tests |
|
||||
| :-------------: | ------ | -------- | ------------- | ---------- | ---- | ---- | ----- |
|
||||
| [`master`](https://github.com/boostorg/date_time/tree/master) | [](https://github.com/boostorg/date_time/actions?query=branch:master) | [](https://ci.appveyor.com/project/cppalliance/date-time/branch/master) | [](https://scan.coverity.com/projects/boostorg-date_time) | [](https://codecov.io/gh/boostorg/date_time/tree/master) | [](https://pdimov.github.io/boostdep-report/master/date_time.html) | [](https://www.boost.org/doc/libs/master/libs/date_time) | [](https://www.boost.org/development/tests/master/developer/date_time.html) |
|
||||
| [`develop`](https://github.com/boostorg/date_time/tree/develop) | [](https://github.com/boostorg/date_time/actions?query=branch:develop) | [](https://ci.appveyor.com/project/cppalliance/date-time/branch/develop) | [](https://scan.coverity.com/projects/boostorg-date_time) | [](https://codecov.io/gh/boostorg/date_time/tree/develop) | [](https://pdimov.github.io/boostdep-report/develop/date_time.html) | [](https://www.boost.org/doc/libs/develop/libs/date_time) | [](https://www.boost.org/development/tests/develop/developer/date_time.html) |
|
||||
|
||||
### Directories
|
||||
|
||||
Note that the built library is only for build backward compatibility and contains no symbols. date_time is now header only.
|
||||
|
||||
| Name | Purpose |
|
||||
| --------- | --------------------------------------- |
|
||||
| `build` | build script for optional lib build |
|
||||
| `data` | timezone database |
|
||||
| `doc` | documentation |
|
||||
| `example` | use case examples |
|
||||
| `include` | headers |
|
||||
| `src` | source code for optional link library |
|
||||
| `test` | unit tests |
|
||||
| `xmldoc` | documentation source |
|
||||
|
||||
### More information
|
||||
|
||||
* [Ask questions](http://stackoverflow.com/questions/ask?tags=c%2B%2B,boost,boost-date_time): Be sure to read the documentation first to see if it answers your question.
|
||||
* [Report bugs](https://github.com/boostorg/date_time/issues): Be sure to mention Boost version, platform and compiler you're using. A small compilable code sample to reproduce the problem is always good as well.
|
||||
* [Submit Pull Requests](https://github.com/boostorg/date_time/pulls) against the **develop** branch. Note that by submitting patches you agree to license your modifications under the [Boost Software License, Version 1.0](http://www.boost.org/LICENSE_1_0.txt). Be sure to include tests proving your changes work properly.
|
||||
* Discussions about the library are held on the [Boost developers mailing list](http://www.boost.org/community/groups.html#main). Be sure to read the [discussion policy](http://www.boost.org/community/policy.html) before posting and add the `[date_time]` tag at the beginning of the subject line.
|
||||
@@ -0,0 +1,37 @@
|
||||
# Copyright René Ferdinand Rivera Morell 2023-2024
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||
# http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
require-b2 5.2 ;
|
||||
|
||||
constant boost_dependencies :
|
||||
/boost/algorithm//boost_algorithm
|
||||
/boost/assert//boost_assert
|
||||
/boost/config//boost_config
|
||||
/boost/core//boost_core
|
||||
/boost/io//boost_io
|
||||
/boost/lexical_cast//boost_lexical_cast
|
||||
/boost/numeric_conversion//boost_numeric_conversion
|
||||
/boost/range//boost_range
|
||||
/boost/smart_ptr//boost_smart_ptr
|
||||
/boost/throw_exception//boost_throw_exception
|
||||
/boost/tokenizer//boost_tokenizer
|
||||
/boost/type_traits//boost_type_traits
|
||||
/boost/utility//boost_utility
|
||||
/boost/winapi//boost_winapi ;
|
||||
|
||||
project /boost/date_time
|
||||
: common-requirements
|
||||
<include>include
|
||||
;
|
||||
|
||||
explicit
|
||||
[ alias boost_date_time : build//boost_date_time ]
|
||||
[ alias all : boost_date_time example test ]
|
||||
;
|
||||
|
||||
call-if : boost-library date_time
|
||||
: install boost_date_time
|
||||
;
|
||||
|
||||
+10
-20
@@ -1,34 +1,24 @@
|
||||
# Copyright (c) 2002-2005 CrystalClear Software, Inc.
|
||||
# Use, modification and distribution is subject to the
|
||||
# Use, modification and distribution is subject to the
|
||||
# Boost Software License, Version 1.0. (See accompanying
|
||||
# file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
#
|
||||
# Boost.date_time build and test Jamfile
|
||||
#
|
||||
# Based on boost.python Jamfile
|
||||
#
|
||||
# To run all tests quietly: jam test
|
||||
#
|
||||
# Declares the following targets:
|
||||
# 1. libboost_date_time, a static link library to be linked with all
|
||||
# Boost.date_time modules
|
||||
# date_time is now header only -- this file provides a stub for backward compatibility
|
||||
#
|
||||
|
||||
|
||||
project boost/date_time
|
||||
project
|
||||
: common-requirements <library>$(boost_dependencies)
|
||||
: requirements
|
||||
<define>DATE_TIME_INLINE
|
||||
<link>shared:<define>BOOST_ALL_DYN_LINK=1
|
||||
<link>static:<define>BOOST_DATE_TIME_STATIC_LINK
|
||||
: usage-requirements
|
||||
<link>shared:<define>BOOST_ALL_DYN_LINK=1
|
||||
: usage-requirements
|
||||
<define>DATE_TIME_INLINE
|
||||
<link>shared:<define>BOOST_DATE_TIME_DYN_LINK=1
|
||||
<define>BOOST_DATE_TIME_NO_LINK=1
|
||||
: source-location ../src
|
||||
;
|
||||
|
||||
# Base names of the source files for libboost_date_time
|
||||
CPP_SOURCES = greg_month greg_weekday date_generators ;
|
||||
|
||||
lib boost_date_time : gregorian/$(CPP_SOURCES).cpp ;
|
||||
|
||||
boost-install boost_date_time ;
|
||||
# greg_month.cpp is now just a stub so that there is
|
||||
# still a boost_date_time library to link for backward compatibility
|
||||
lib boost_date_time : gregorian/greg_month.cpp ;
|
||||
|
||||
+239
-101
@@ -3,6 +3,7 @@
|
||||
"Africa/Accra","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Addis_Ababa","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Algiers","CET","CET","","","+01:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Asmara","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Asmera","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Bamako","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Bangui","WAT","WAT","","","+01:00:00","+00:00:00","","","","+00:00:00"
|
||||
@@ -11,19 +12,20 @@
|
||||
"Africa/Blantyre","CAT","CAT","","","+02:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Brazzaville","WAT","WAT","","","+01:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Bujumbura","CAT","CAT","","","+02:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Cairo","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;5;4","+00:00:00","-1;5;9","+00:00:00"
|
||||
"Africa/Casablanca","WET","WET","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Cairo","EET","EET","","","+02:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Casablanca","WET","WET","WEST","WEST","+00:00:00","+01:00:00","2;0;7","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Africa/Ceuta","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Africa/Conakry","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Dakar","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Dar_es_Salaam","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Djibouti","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Douala","WAT","WAT","","","+01:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/El_Aaiun","WET","WET","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/El_Aaiun","WET","WET","WEST","WEST","+00:00:00","+01:00:00","2;0;7","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Africa/Freetown","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Gaborone","CAT","CAT","","","+02:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Harare","CAT","CAT","","","+02:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Johannesburg","SAST","SAST","","","+02:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Juba","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Kampala","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Khartoum","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Kigali","CAT","CAT","","","+02:00:00","+00:00:00","","","","+00:00:00"
|
||||
@@ -46,36 +48,62 @@
|
||||
"Africa/Nouakchott","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Ouagadougou","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Porto-Novo","WAT","WAT","","","+01:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Porto_Novo","WAT","WAT","","","+01:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Sao_Tome","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Timbuktu","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Tripoli","EET","EET","","","+02:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Tunis","CET","CET","","","+01:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Africa/Windhoek","WAT","WAT","WAST","WAST","+01:00:00","+01:00:00","1;0;9","+02:00:00","1;0;4","+02:00:00"
|
||||
"America/Adak","HAST","HAST","HADT","HADT","-10:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Adak","HST","HST","HDT","HDT","-10:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Anchorage","AKST","AKST","AKDT","AKDT","-09:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Anguilla","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Antigua","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Araguaina","BRT","BRT","BRST","BRST","-03:00:00","+01:00:00","2;0;10","+00:00:00","3;0;2","+00:00:00"
|
||||
"America/Araguaina","BRT","BRT","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Argentina/Buenos_Aires","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Argentina/Catamarca","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Argentina/ComodRivadavia","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Argentina/Cordoba","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Argentina/Jujuy","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Argentina/La_Rioja","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Argentina/Mendoza","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Argentina/Rio_Gallegos","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Argentina/Salta","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Argentina/San_Juan","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Argentina/San_Luis","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Argentina/Tucuman","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Argentina/Ushuaia","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Aruba","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Asuncion","PYT","PYT","PYST","PYST","-04:00:00","+01:00:00","1;0;10","+00:00:00","1;0;3","+00:00:00"
|
||||
"America/Asuncion","PYT","PYT","PYST","PYST","-04:00:00","+01:00:00","1;0;10","+00:00:00","-1;0;3","+00:00:00"
|
||||
"America/Atikokan","EST","EST","","","-05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Atka","HST","HST","HDT","HDT","-10:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Bahia","BRT","BRT","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Bahia_Banderas","CST","CST","CDT","CDT","-06:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
|
||||
"America/Barbados","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Belem","BRT","BRT","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Belize","CST","CST","","","-06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Beulah","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Blanc-Sablon","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Blanc_Sablon","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Boa_Vista","AMT","AMT","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Bogota","COT","COT","","","-05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Boise","MST","MST","MDT","MDT","-07:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Buenos_Aires","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Cambridge_Bay","MST","MST","MDT","MDT","-07:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Cancun","CST","CST","CDT","CDT","-06:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
|
||||
"America/Caracas","VET","VET","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Campo_Grande","AMT","AMT","AMST","AMST","-04:00:00","+01:00:00","3;0;10","+00:00:00","3;0;2","+00:00:00"
|
||||
"America/Cancun","EST","EST","","","-05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Caracas","VET","VET","","","-04:30:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Catamarca","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Cayenne","GFT","GFT","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Cayman","EST","EST","","","-05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Center","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Chicago","CST","Central Standard Time","CDT","Central Daylight Time","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Chihuahua","MST","MST","MDT","MDT","-07:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
|
||||
"America/ComodRivadavia","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Coral_Harbour","EST","EST","","","-05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Cordoba","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Costa_Rica","CST","CST","","","-06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Cuiaba","AMT","AMT","AMST","AMST","-04:00:00","+01:00:00","2;0;10","+00:00:00","3;0;2","+00:00:00"
|
||||
"America/Creston","MST","MST","","","-07:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Cuiaba","AMT","AMT","AMST","AMST","-04:00:00","+01:00:00","3;0;10","+00:00:00","3;0;2","+00:00:00"
|
||||
"America/Curacao","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Danmarkshavn","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Dawson","PST","PST","PDT","PDT","-08:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
@@ -86,24 +114,30 @@
|
||||
"America/Edmonton","MST","MST","MDT","MDT","-07:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Eirunepe","ACT","ACT","","","-05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/El_Salvador","CST","CST","","","-06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Fortaleza","BRT","BRT","BRST","BRST","-03:00:00","+01:00:00","2;0;10","+00:00:00","3;0;2","+00:00:00"
|
||||
"America/Ensenada","PST","PST","PDT","PDT","-08:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Fortaleza","BRT","BRT","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Fort_Wayne","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Glace_Bay","AST","AST","ADT","ADT","-04:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Godthab","WGT","WGT","WGST","WGST","-03:00:00","+01:00:00","-1;6;3","+22:00:00","-1;6;10","+23:00:00"
|
||||
"America/Goose_Bay","AST","AST","ADT","ADT","-04:00:00","+01:00:00","1;0;4","+00:01:00","-1;0;10","+00:01:00"
|
||||
"America/Grand_Turk","EST","EST","EDT","EDT","-05:00:00","+01:00:00","1;0;4","+00:00:00","-1;0;10","+00:00:00"
|
||||
"America/Goose_Bay","AST","AST","ADT","ADT","-04:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Grand_Turk","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Grenada","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Guadeloupe","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Guatemala","CST","CST","","","-06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Guayaquil","ECT","ECT","","","-05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Guyana","GYT","GYT","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Halifax","AST","AST","ADT","ADT","-04:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Havana","CST","CST","CDT","CDT","-05:00:00","+01:00:00","1;0;4","+00:00:00","-1;0;10","+01:00:00"
|
||||
"America/Havana","CST","CST","CDT","CDT","-05:00:00","+01:00:00","2;0;3","+00:00:00","1;0;11","+01:00:00"
|
||||
"America/Hermosillo","MST","MST","","","-07:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Indiana/Indianapolis","EST","EST","","","-05:00:00","+00:00:00","2;0;3","","1;0;11","+00:00:00"
|
||||
"America/Indiana/Knox","EST","EST","","","-05:00:00","+00:00:00","2;0;3","","1;0;11","+00:00:00"
|
||||
"America/Indiana/Marengo","EST","EST","","","-05:00:00","+00:00:00","2;0;3","","1;0;11","+00:00:00"
|
||||
"America/Indiana/Vevay","EST","EST","","","-05:00:00","+00:00:00","2;0;3","","1;0;11","+00:00:00"
|
||||
"America/Indianapolis","EST","EST","","","-05:00:00","+00:00:00","2;0;3","","1;0;11","+00:00:00"
|
||||
"America/Indiana/Indianapolis","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Indiana/Knox","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Indiana/Marengo","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Indiana/Petersburg","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Indiana/Tell_City","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Indiana/Vevay","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Indiana/Vincennes","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Indiana/Winamac","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Indianapolis","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Inuvik","MST","MST","MDT","MDT","-07:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Iqaluit","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Jamaica","EST","EST","","","-05:00:00","+00:00:00","","","","+00:00:00"
|
||||
@@ -111,174 +145,264 @@
|
||||
"America/Juneau","AKST","AKST","AKDT","AKDT","-09:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Kentucky/Louisville","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Kentucky/Monticello","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Knox","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Knox_IN","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Kralendijk","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/La_Paz","BOT","BOT","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/La_Rioja","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Lima","PET","PET","","","-05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Los_Angeles","PST","Pacific Standard Time","PDT","Pacific Daylight Time","-08:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Louisville","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Maceio","BRT","BRT","BRST","BRST","-03:00:00","+01:00:00","2;0;10","+00:00:00","3;0;2","+00:00:00"
|
||||
"America/Lower_Princes","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Maceio","BRT","BRT","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Managua","CST","CST","","","-06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Manaus","AMT","AMT","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Marengo","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Marigot","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Martinique","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Matamoros","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Mazatlan","MST","MST","MDT","MDT","-07:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
|
||||
"America/Mendoza","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Menominee","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Merida","CST","CST","CDT","CDT","-06:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
|
||||
"America/Metlakatla","AKST","AKST","AKDT","AKDT","-09:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Mexico_City","CST","CST","CDT","CDT","-06:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
|
||||
"America/Miquelon","PMST","PMST","PMDT","PMDT","-03:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Moncton","AST","AST","ADT","ADT","-04:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Monterrey","CST","CST","CDT","CDT","-06:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
|
||||
"America/Montevideo","UYT","UYT","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Monticello","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Montreal","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Montserrat","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Nassau","EST","EST","EDT","EDT","-05:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
|
||||
"America/Nassau","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/New_Salem","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/New_York","EST","Eastern Standard Time","EDT","Eastern Daylight Time","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Nipigon","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Nome","AKST","AKST","AKDT","AKDT","-09:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Noronha","FNT","FNT","","","-02:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/North_Dakota/Beulah","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/North_Dakota/Center","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/North_Dakota/New_Salem","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Ojinaga","MST","MST","MDT","MDT","-07:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Panama","EST","EST","","","-05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Pangnirtung","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Paramaribo","SRT","SRT","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Petersburg","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Phoenix","MST","Mountain Standard Time","","","-07:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Port-au-Prince","EST","EST","","","-05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Port_of_Spain","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Porto_Acre","ACT","ACT","","","-05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Porto_Velho","AMT","AMT","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Port_au_Prince","EST","EST","","","-05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Port_of_Spain","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Puerto_Rico","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Rainy_River","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Rankin_Inlet","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Recife","BRT","BRT","BRST","BRST","-03:00:00","+01:00:00","2;0;10","+00:00:00","3;0;2","+00:00:00"
|
||||
"America/Recife","BRT","BRT","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Regina","CST","CST","","","-06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Resolute","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Rio_Branco","ACT","ACT","","","-05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Rio_Gallegos","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Rosario","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Santiago","CLT","CLT","CLST","CLST","-04:00:00","+01:00:00","2;0;10","+00:00:00","2;0;3","+00:00:00"
|
||||
"America/Salta","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Santarem","BRT","BRT","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Santa_Isabel","PST","PST","PDT","PDT","-08:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Santiago","CLT","CLT","CLST","CLST","-04:00:00","+01:00:00","2;0;8","+00:00:00","3;0;5","+00:00:00"
|
||||
"America/Santo_Domingo","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Sao_Paulo","BRT","BRT","BRST","BRST","-03:00:00","+01:00:00","2;0;10","+00:00:00","3;0;2","+00:00:00"
|
||||
"America/San_Juan","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/San_Luis","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Sao_Paulo","BRT","BRT","BRST","BRST","-03:00:00","+01:00:00","3;0;10","+00:00:00","3;0;2","+00:00:00"
|
||||
"America/Scoresbysund","EGT","EGT","EGST","EGST","-01:00:00","+01:00:00","-1;0;3","+00:00:00","-1;0;10","+01:00:00"
|
||||
"America/Shiprock","MST","MST","MDT","MDT","-07:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/St_Johns","NST","NST","NDT","NDT","-03:30:00","+01:00:00","1;0;4","+00:01:00","-1;0;10","+00:01:00"
|
||||
"America/Sitka","AKST","AKST","AKDT","AKDT","-09:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/St_Barthelemy","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/St_Johns","NST","NST","NDT","NDT","-03:30:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/St_Kitts","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/St_Lucia","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/St_Thomas","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/St_Vincent","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Swift_Current","CST","CST","","","-06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Tegucigalpa","CST","CST","","","-06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Thule","AST","AST","","","-04:00:00","+00:00:00","2;0;3","","1;0;11","+00:00:00"
|
||||
"America/Tell_City","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Thule","AST","AST","ADT","ADT","-04:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Thunder_Bay","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Tijuana","PST","PST","PDT","PDT","-08:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
|
||||
"America/Tijuana","PST","PST","PDT","PDT","-08:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Toronto","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Tortola","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Tucuman","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Ushuaia","ART","ART","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Vancouver","PST","PST","PDT","PDT","-08:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Vevay","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Vincennes","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Virgin","AST","AST","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"America/Whitehorse","PST","PST","PDT","PDT","-08:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Winnipeg","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+03:00:00"
|
||||
"America/Winamac","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Winnipeg","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Yakutat","AKST","AKST","AKDT","AKDT","-09:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"America/Yellowknife","MST","MST","MDT","MDT","-07:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"Antarctica/Casey","WST","WST","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Antarctica/Casey","AWST","AWST","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Antarctica/Davis","DAVT","DAVT","","","+07:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Antarctica/DumontDUrville","DDUT","DDUT","","","+10:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Antarctica/Mawson","MAWT","MAWT","","","+06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Antarctica/McMurdo","NZST","NZST","NZDT","NZDT","+12:00:00","+01:00:00","1;0;10","+02:00:00","3;0;3","+03:00:00"
|
||||
"Antarctica/Palmer","CLT","CLT","CLST","CLST","-04:00:00","+01:00:00","2;0;10","+00:00:00","2;0;3","+00:00:00"
|
||||
"Antarctica/South_Pole","NZST","NZST","NZDT","NZDT","+12:00:00","+01:00:00","1;0;10","+02:00:00","3;0;3","+03:00:00"
|
||||
"Antarctica/Macquarie","MIST","MIST","","","+11:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Antarctica/Mawson","MAWT","MAWT","","","+05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Antarctica/McMurdo","NZST","NZST","NZDT","NZDT","+12:00:00","+01:00:00","-1;0;9","+02:00:00","1;0;4","+03:00:00"
|
||||
"Antarctica/Palmer","CLT","CLT","CLST","CLST","-04:00:00","+01:00:00","2;0;8","+00:00:00","3;0;5","+00:00:00"
|
||||
"Antarctica/Rothera","ROTT","ROTT","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Antarctica/South_Pole","NZST","NZST","NZDT","NZDT","+12:00:00","+01:00:00","-1;0;9","+02:00:00","1;0;4","+03:00:00"
|
||||
"Antarctica/Syowa","SYOT","SYOT","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Antarctica/Troll","UTC","UTC","CEST","CEST","+00:00:00","+02:00:00","-1;0;3","+01:00:00","-1;0;10","+03:00:00"
|
||||
"Antarctica/Vostok","VOST","VOST","","","+06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Arctic/Longyearbyen","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Asia/Aden","AST","AST","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Almaty","ALMT","ALMT","ALMST","ALMST","+06:00:00","+01:00:00","-1;0;3","+00:00:00","-1;0;10","+00:00:00"
|
||||
"Asia/Amman","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;4;3","+00:00:00","-1;4;9","+01:00:00"
|
||||
"Asia/Anadyr","ANAT","ANAT","ANAST","ANAST","+12:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Asia/Aqtau","AQTT","AQTT","AQTST","AQTST","+04:00:00","+01:00:00","-1;0;3","+00:00:00","-1;0;10","+00:00:00"
|
||||
"Asia/Aqtobe","AQTT","AQTT","AQTST","AQTST","+05:00:00","+01:00:00","-1;0;3","+00:00:00","-1;0;10","+00:00:00"
|
||||
"Asia/Almaty","ALMT","ALMT","","","+06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Amman","EET","EET","EEST","EEST","+02:00:00","+01:00:00","1;5;4","+00:00:00","-1;5;10","+01:00:00"
|
||||
"Asia/Anadyr","ANAT","ANAT","","","+12:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Aqtau","AQTT","AQTT","","","+05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Aqtobe","AQTT","AQTT","","","+05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Ashgabat","TMT","TMT","","","+05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Baghdad","AST","AST","ADT","ADT","+03:00:00","+01:00:00","1;0;4","+03:00:00","1;0;10","+04:00:00"
|
||||
"Asia/Ashkhabad","TMT","TMT","","","+05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Baghdad","AST","AST","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Bahrain","AST","AST","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Baku","AZT","AZT","AZST","AZST","+04:00:00","+01:00:00","-1;0;3","+01:00:00","-1;0;10","+01:00:00"
|
||||
"Asia/Baku","AZT","AZT","","","+04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Bangkok","ICT","ICT","","","+07:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Beirut","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+00:00:00","-1;0;10","+00:00:00"
|
||||
"Asia/Bishkek","KGT","KGT","KGST","KGST","+05:00:00","+01:00:00","-1;0;3","+02:30:00","-1;0;10","+02:30:00"
|
||||
"Asia/Bishkek","KGT","KGT","","","+06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Brunei","BNT","BNT","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Calcutta","IST","IST","","","+05:30:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Choibalsan","CHOT","CHOT","","","+09:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Chita","YAKT","YAKT","","","+09:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Choibalsan","CHOT","CHOT","CHOST","CHOST","+08:00:00","+01:00:00","-1;6;3","+02:00:00","-1;6;9","+00:00:00"
|
||||
"Asia/Chongqing","CST","CST","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Colombo","LKT","LKT","","","+06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Damascus","EET","EET","EEST","EEST","+02:00:00","+01:00:00","1;0;4","+00:00:00","1;0;10","+00:00:00"
|
||||
"Asia/Chungking","CST","CST","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Colombo","IST","IST","","","+05:30:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Dacca","BDT","BDT","","","+06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Damascus","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;5;3","+00:00:00","-1;5;10","+00:00:00"
|
||||
"Asia/Dhaka","BDT","BDT","","","+06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Dili","TPT","TPT","","","+09:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Dili","TLT","TLT","","","+09:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Dubai","GST","GST","","","+04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Dushanbe","TJT","TJT","","","+05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Gaza","EET","EET","EEST","EEST","+02:00:00","+01:00:00","3;5;4","+00:00:00","3;5;10","+00:00:00"
|
||||
"Asia/Gaza","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;6;3","+01:00:00","3;5;10","+00:00:00"
|
||||
"Asia/Harbin","CST","CST","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Hebron","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;6;3","+01:00:00","3;5;10","+00:00:00"
|
||||
"Asia/Hong_Kong","HKT","HKT","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Hovd","HOVT","HOVT","","","+07:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Irkutsk","IRKT","IRKT","IRKST","IRKST","+08:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Asia/Hovd","HOVT","HOVT","HOVST","HOVST","+07:00:00","+01:00:00","-1;6;3","+02:00:00","-1;6;9","+00:00:00"
|
||||
"Asia/Ho_Chi_Minh","ICT","ICT","","","+07:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Irkutsk","IRKT","IRKT","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Istanbul","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
|
||||
"Asia/Jakarta","WIT","WIT","","","+07:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Jayapura","EIT","EIT","","","+09:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Jerusalem","IST","IST","IDT","IDT","+02:00:00","+01:00:00","1;0;4","+01:00:00","1;0;10","+01:00:00"
|
||||
"Asia/Jakarta","WIB","WIB","","","+07:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Jayapura","WIT","WIT","","","+09:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Jerusalem","IST","IST","IDT","IDT","+02:00:00","+01:00:00","-1;5;3","+02:00:00","-1;0;10","+02:00:00"
|
||||
"Asia/Kabul","AFT","AFT","","","+04:30:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Kamchatka","PETT","PETT","PETST","PETST","+12:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Asia/Kamchatka","PETT","PETT","","","+12:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Karachi","PKT","PKT","","","+05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Kashgar","CST","CST","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Kashgar","XJT","XJT","","","+06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Kathmandu","NPT","NPT","","","+05:45:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Katmandu","NPT","NPT","","","+05:45:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Krasnoyarsk","KRAT","KRAT","KRAST","KRAST","+07:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Asia/Khandyga","YAKT","YAKT","","","+09:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Kolkata","IST","IST","","","+05:30:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Krasnoyarsk","KRAT","KRAT","","","+07:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Kuala_Lumpur","MYT","MYT","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Kuching","MYT","MYT","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Kuwait","AST","AST","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Macao","CST","CST","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Macau","CST","CST","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Magadan","MAGT","MAGT","MAGST","MAGST","+11:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Asia/Makassar","CIT","CIT","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Magadan","MAGT","MAGT","","","+10:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Makassar","WITA","WITA","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Manila","PHT","PHT","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Muscat","GST","GST","","","+04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Nicosia","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
|
||||
"Asia/Novosibirsk","NOVT","NOVT","NOVST","NOVST","+06:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Asia/Omsk","OMST","OMST","OMSST","OMSST","+06:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Asia/Oral","WST","WST","","","+05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Novokuznetsk","KRAT","KRAT","","","+07:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Novosibirsk","NOVT","NOVT","","","+06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Omsk","OMST","OMST","","","+06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Oral","ORAT","ORAT","","","+05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Phnom_Penh","ICT","ICT","","","+07:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Pontianak","WIT","WIT","","","+07:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Pyongyang","KST","KST","","","+09:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Qyzylorda","KST","KST","","","+06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Pontianak","WIB","WIB","","","+07:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Pyongyang","KST","KST","","","+08:30:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Qatar","AST","AST","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Qyzylorda","QYZT","QYZT","","","+06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Rangoon","MMT","MMT","","","+06:30:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Riyadh","AST","AST","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Saigon","ICT","ICT","","","+07:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Sakhalin","SAKT","SAKT","SAKST","SAKST","+10:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Asia/Sakhalin","SAKT","SAKT","","","+11:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Samarkand","UZT","UZT","","","+05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Seoul","KST","KST","","","+09:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Shanghai","CST","CST","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Singapore","SGT","SGT","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Srednekolymsk","SRET","SRET","","","+11:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Taipei","CST","CST","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Tashkent","UZT","UZT","","","+05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Tbilisi","GET","GET","GEST","GEST","+04:00:00","+01:00:00","-1;0;3","+00:00:00","-1;0;10","+00:00:00"
|
||||
"Asia/Tehran","IRT","IRT","","","+03:30:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Tbilisi","GET","GET","","","+04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Tehran","IRST","IRST","IRDT","IRDT","+03:30:00","+01:00:00","3;1;3","+00:00:00","3;3;9","+00:00:00"
|
||||
"Asia/Tel_Aviv","IST","IST","IDT","IDT","+02:00:00","+01:00:00","-1;5;3","+02:00:00","-1;0;10","+02:00:00"
|
||||
"Asia/Thimbu","BTT","BTT","","","+06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Thimphu","BTT","BTT","","","+06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Tokyo","JST","JST","","","+09:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Ujung_Pandang","CIT","CIT","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Ulaanbaatar","ULAT","ULAT","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Urumqi","CST","CST","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Ujung_Pandang","WITA","WITA","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Ulaanbaatar","ULAT","ULAT","ULAST","ULAST","+08:00:00","+01:00:00","-1;6;3","+02:00:00","-1;6;9","+00:00:00"
|
||||
"Asia/Ulan_Bator","ULAT","ULAT","ULAST","ULAST","+08:00:00","+01:00:00","-1;6;3","+02:00:00","-1;6;9","+00:00:00"
|
||||
"Asia/Urumqi","XJT","XJT","","","+06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Ust-Nera","VLAT","VLAT","","","+10:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Ust_Nera","VLAT","VLAT","","","+10:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Vientiane","ICT","ICT","","","+07:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Vladivostok","VLAT","VLAT","VLAST","VLAST","+10:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Asia/Yakutsk","YAKT","YAKT","YAKST","YAKST","+09:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Asia/Yekaterinburg","YEKT","YEKT","YEKST","YEKST","+05:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Asia/Yerevan","AMT","AMT","AMST","AMST","+04:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Asia/Vladivostok","VLAT","VLAT","","","+10:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Yakutsk","YAKT","YAKT","","","+09:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Yekaterinburg","YEKT","YEKT","","","+05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Asia/Yerevan","AMT","AMT","","","+04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Atlantic/Azores","AZOT","AZOT","AZOST","AZOST","-01:00:00","+01:00:00","-1;0;3","+00:00:00","-1;0;10","+01:00:00"
|
||||
"Atlantic/Bermuda","AST","AST","ADT","ADT","-04:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
|
||||
"Atlantic/Bermuda","AST","AST","ADT","ADT","-04:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"Atlantic/Canary","WET","WET","WEST","WEST","+00:00:00","+01:00:00","-1;0;3","+01:00:00","-1;0;10","+02:00:00"
|
||||
"Atlantic/Cape_Verde","CVT","CVT","","","-01:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Atlantic/Faeroe","WET","WET","WEST","WEST","+00:00:00","+01:00:00","-1;0;3","+01:00:00","-1;0;10","+02:00:00"
|
||||
"Atlantic/Faroe","WET","WET","WEST","WEST","+00:00:00","+01:00:00","-1;0;3","+01:00:00","-1;0;10","+02:00:00"
|
||||
"Atlantic/Jan_Mayen","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Atlantic/Madeira","WET","WET","WEST","WEST","+00:00:00","+01:00:00","-1;0;3","+01:00:00","-1;0;10","+02:00:00"
|
||||
"Atlantic/Reykjavik","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Atlantic/South_Georgia","GST","GST","","","-02:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Atlantic/Stanley","FKST","FKST","","","-03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Atlantic/St_Helena","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Atlantic/Stanley","FKT","FKT","FKST","FKST","-04:00:00","+01:00:00","1;0;9","+02:00:00","3;0;4","+02:00:00"
|
||||
"Australia/Adelaide","CST","CST","CST","CST","+09:30:00","+01:00:00","-1;0;10","+02:00:00","-1;0;3","+03:00:00"
|
||||
"Australia/Brisbane","EST","EST","","","+10:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Australia/Broken_Hill","CST","CST","CST","CST","+09:30:00","+01:00:00","-1;0;10","+02:00:00","-1;0;3","+03:00:00"
|
||||
"Australia/Darwin","CST","CST","","","+09:30:00","+00:00:00","","","","+00:00:00"
|
||||
"Australia/Hobart","EST","EST","EST","EST","+10:00:00","+01:00:00","1;0;10","+02:00:00","-1;0;3","+03:00:00"
|
||||
"Australia/Lindeman","EST","EST","","","+10:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Australia/Lord_Howe","LHST","LHST","LHST","LHST","+10:30:00","+00:30:00","-1;0;10","+02:00:00","-1;0;3","+02:00:00"
|
||||
"Australia/Melbourne","EST","EST","EST","EST","+10:00:00","+01:00:00","-1;0;10","+02:00:00","-1;0;3","+03:00:00"
|
||||
"Australia/Perth","WST","WST","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Australia/Sydney","EST","EST","EST","EST","+10:00:00","+01:00:00","-1;0;10","+02:00:00","-1;0;3","+03:00:00"
|
||||
"Australia/ACT","AEST","AEST","AEDT","AEDT","+10:00:00","+01:00:00","1;0;10","+02:00:00","1;0;4","+03:00:00"
|
||||
"Australia/Adelaide","ACST","ACST","ACDT","ACDT","+09:30:00","+01:00:00","1;0;10","+02:00:00","1;0;4","+03:00:00"
|
||||
"Australia/Brisbane","AEST","AEST","","","+10:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Australia/Broken_Hill","ACST","ACST","ACDT","ACDT","+09:30:00","+01:00:00","1;0;10","+02:00:00","1;0;4","+03:00:00"
|
||||
"Australia/Canberra","AEST","AEST","AEDT","AEDT","+10:00:00","+01:00:00","1;0;10","+02:00:00","1;0;4","+03:00:00"
|
||||
"Australia/Currie","AEST","AEST","AEDT","AEDT","+10:00:00","+01:00:00","1;0;10","+02:00:00","1;0;4","+03:00:00"
|
||||
"Australia/Darwin","ACST","ACST","","","+09:30:00","+00:00:00","","","","+00:00:00"
|
||||
"Australia/Eucla","ACWST","ACWST","","","+08:45:00","+00:00:00","","","","+00:00:00"
|
||||
"Australia/Hobart","AEST","AEST","AEDT","AEDT","+10:00:00","+01:00:00","1;0;10","+02:00:00","1;0;4","+03:00:00"
|
||||
"Australia/LHI","LHST","LHST","LHDT","LHDT","+10:30:00","+00:30:00","1;0;10","+02:00:00","1;0;4","+02:00:00"
|
||||
"Australia/Lindeman","AEST","AEST","","","+10:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Australia/Lord_Howe","LHST","LHST","LHDT","LHDT","+10:30:00","+00:30:00","1;0;10","+02:00:00","1;0;4","+02:00:00"
|
||||
"Australia/Melbourne","AEST","AEST","AEDT","AEDT","+10:00:00","+01:00:00","1;0;10","+02:00:00","1;0;4","+03:00:00"
|
||||
"Australia/North","ACST","ACST","","","+09:30:00","+00:00:00","","","","+00:00:00"
|
||||
"Australia/NSW","AEST","AEST","AEDT","AEDT","+10:00:00","+01:00:00","1;0;10","+02:00:00","1;0;4","+03:00:00"
|
||||
"Australia/Perth","AWST","AWST","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Australia/Queensland","AEST","AEST","","","+10:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Australia/South","ACST","ACST","ACDT","ACDT","+09:30:00","+01:00:00","1;0;10","+02:00:00","1;0;4","+03:00:00"
|
||||
"Australia/Sydney","AEST","AEST","AEDT","AEDT","+10:00:00","+01:00:00","1;0;10","+02:00:00","1;0;4","+03:00:00"
|
||||
"Australia/Tasmania","AEST","AEST","AEDT","AEDT","+10:00:00","+01:00:00","1;0;10","+02:00:00","1;0;4","+03:00:00"
|
||||
"Australia/Victoria","AEST","AEST","AEDT","AEDT","+10:00:00","+01:00:00","1;0;10","+02:00:00","1;0;4","+03:00:00"
|
||||
"Australia/West","AWST","AWST","","","+08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Australia/Yancowinna","ACST","ACST","ACDT","ACDT","+09:30:00","+01:00:00","1;0;10","+02:00:00","1;0;4","+03:00:00"
|
||||
"Brazil/Acre","ACT","ACT","","","-05:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Brazil/DeNoronha","FNT","FNT","","","-02:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Brazil/East","BRT","BRT","BRST","BRST","-03:00:00","+01:00:00","3;0;10","+00:00:00","3;0;2","+00:00:00"
|
||||
"Brazil/West","AMT","AMT","","","-04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Canada/Atlantic","AST","AST","ADT","ADT","-04:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"Canada/Central","CST","CST","CDT","CDT","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"Canada/East-Saskatchewan","CST","CST","","","-06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Canada/Eastern","EST","EST","EDT","EDT","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"Canada/East_Saskatchewan","CST","CST","","","-06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Canada/Mountain","MST","MST","MDT","MDT","-07:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"Canada/Newfoundland","NST","NST","NDT","NDT","-03:30:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"Canada/Pacific","PST","PST","PDT","PDT","-08:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"Canada/Saskatchewan","CST","CST","","","-06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Canada/Yukon","PST","PST","PDT","PDT","-08:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"Chile/Continental","CLT","CLT","CLST","CLST","-04:00:00","+01:00:00","2;0;8","+00:00:00","3;0;5","+00:00:00"
|
||||
"Chile/EasterIsland","EAST","EAST","EASST","EASST","-06:00:00","+01:00:00","2;6;8","+22:00:00","2;6;5","+22:00:00"
|
||||
"Etc/GMT","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Etc/Greenwich","GMT","GMT","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Etc/UCT","UCT","UCT","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Etc/Universal","UTC","UTC","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Etc/UTC","UTC","UTC","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Etc/Zulu","UTC","UTC","","","+00:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Europe/Amsterdam","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Andorra","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Athens","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
|
||||
@@ -289,13 +413,17 @@
|
||||
"Europe/Brussels","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Bucharest","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
|
||||
"Europe/Budapest","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Chisinau","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
|
||||
"Europe/Busingen","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Chisinau","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Copenhagen","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Dublin","GMT","GMT","IST","IST","+00:00:00","+01:00:00","-1;0;3","+01:00:00","-1;0;10","+02:00:00"
|
||||
"Europe/Gibraltar","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Guernsey","GMT","GMT","BST","BST","+00:00:00","+01:00:00","-1;0;3","+01:00:00","-1;0;10","+02:00:00"
|
||||
"Europe/Helsinki","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
|
||||
"Europe/Isle_of_Man","GMT","GMT","BST","BST","+00:00:00","+01:00:00","-1;0;3","+01:00:00","-1;0;10","+02:00:00"
|
||||
"Europe/Istanbul","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
|
||||
"Europe/Kaliningrad","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Jersey","GMT","GMT","BST","BST","+00:00:00","+01:00:00","-1;0;3","+01:00:00","-1;0;10","+02:00:00"
|
||||
"Europe/Kaliningrad","EET","EET","","","+02:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Europe/Kiev","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
|
||||
"Europe/Lisbon","WET","WET","WEST","WEST","+00:00:00","+01:00:00","-1;0;3","+01:00:00","-1;0;10","+02:00:00"
|
||||
"Europe/Ljubljana","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
@@ -303,29 +431,33 @@
|
||||
"Europe/Luxembourg","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Madrid","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Malta","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Minsk","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Mariehamn","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
|
||||
"Europe/Minsk","MSK","MSK","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Europe/Monaco","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Moscow","MSK","MSK","MSD","MSD","+03:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Moscow","MSK","MSK","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Europe/Nicosia","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
|
||||
"Europe/Oslo","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Paris","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Podgorica","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Prague","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Riga","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
|
||||
"Europe/Rome","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Samara","SAMT","SAMT","SAMST","SAMST","+04:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Samara","SAMT","SAMT","","","+04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Europe/San_Marino","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Sarajevo","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Simferopol","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
|
||||
"Europe/Simferopol","MSK","MSK","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Europe/Skopje","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Sofia","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
|
||||
"Europe/Stockholm","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Tallinn","EET","EET","","","+02:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Europe/Tallinn","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
|
||||
"Europe/Tirane","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Tiraspol","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Uzhgorod","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
|
||||
"Europe/Vaduz","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Vatican","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Vienna","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Vilnius","EET","EET","","","+02:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Europe/Vilnius","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
|
||||
"Europe/Volgograd","MSK","MSK","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Europe/Warsaw","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Zagreb","CET","CET","CEST","CEST","+01:00:00","+01:00:00","-1;0;3","+02:00:00","-1;0;10","+03:00:00"
|
||||
"Europe/Zaporozhye","EET","EET","EEST","EEST","+02:00:00","+01:00:00","-1;0;3","+03:00:00","-1;0;10","+04:00:00"
|
||||
@@ -341,14 +473,18 @@
|
||||
"Indian/Mauritius","MUT","MUT","","","+04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Indian/Mayotte","EAT","EAT","","","+03:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Indian/Reunion","RET","RET","","","+04:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Apia","WST","WST","","","-11:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Auckland","NZST","NZST","NZDT","NZDT","+12:00:00","+01:00:00","1;0;10","+02:00:00","3;0;3","+03:00:00"
|
||||
"Pacific/Chatham","CHAST","CHAST","CHADT","CHADT","+12:45:00","+01:00:00","1;0;10","+02:45:00","3;0;3","+03:45:00"
|
||||
"Pacific/Easter","EAST","EAST","EASST","EASST","-06:00:00","+01:00:00","2;6;10","+22:00:00","2;6;3","+22:00:00"
|
||||
"Mexico/BajaNorte","PST","PST","PDT","PDT","-08:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"
|
||||
"Mexico/BajaSur","MST","MST","MDT","MDT","-07:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
|
||||
"Mexico/General","CST","CST","CDT","CDT","-06:00:00","+01:00:00","1;0;4","+02:00:00","-1;0;10","+02:00:00"
|
||||
"Pacific/Apia","WSST","WSST","WSDT","WSDT","+13:00:00","+01:00:00","-1;0;9","+03:00:00","1;0;4","+04:00:00"
|
||||
"Pacific/Auckland","NZST","NZST","NZDT","NZDT","+12:00:00","+01:00:00","-1;0;9","+02:00:00","1;0;4","+03:00:00"
|
||||
"Pacific/Chatham","CHAST","CHAST","CHADT","CHADT","+12:45:00","+01:00:00","-1;0;9","+02:00:00","1;0;4","+03:00:00"
|
||||
"Pacific/Chuuk","CHUT","CHUT","","","+10:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Easter","EAST","EAST","EASST","EASST","-06:00:00","+01:00:00","2;6;8","+22:00:00","2;6;5","+22:00:00"
|
||||
"Pacific/Efate","VUT","VUT","","","+11:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Enderbury","PHOT","PHOT","","","+13:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Fakaofo","TKT","TKT","","","-10:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Fiji","FJT","FJT","","","+12:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Fakaofo","TKT","TKT","","","+13:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Fiji","FJT","FJT","FJST","FJST","+12:00:00","+01:00:00","1;0;11","+02:00:00","3;0;1","+03:00:00"
|
||||
"Pacific/Funafuti","TVT","TVT","","","+12:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Galapagos","GALT","GALT","","","-06:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Gambier","GAMT","GAMT","","","-09:00:00","+00:00:00","","","","+00:00:00"
|
||||
@@ -364,19 +500,21 @@
|
||||
"Pacific/Midway","SST","SST","","","-11:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Nauru","NRT","NRT","","","+12:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Niue","NUT","NUT","","","-11:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Norfolk","NFT","NFT","","","+11:30:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Norfolk","NFT","NFT","","","+11:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Noumea","NCT","NCT","","","+11:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Pago_Pago","SST","SST","","","-11:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Palau","PWT","PWT","","","+09:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Pitcairn","PST","PST","","","-08:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Pohnpei","PONT","PONT","","","+11:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Ponape","PONT","PONT","","","+11:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Port_Moresby","PGT","PGT","","","+10:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Rarotonga","CKT","CKT","","","-10:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Saipan","ChST","ChST","","","+10:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Samoa","SST","SST","","","-11:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Tahiti","TAHT","TAHT","","","-10:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Tarawa","GILT","GILT","","","+12:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Tongatapu","TOT","TOT","","","+13:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Truk","TRUT","TRUT","","","+10:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Truk","CHUT","CHUT","","","+10:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Wake","WAKT","WAKT","","","+12:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Wallis","WFT","WFT","","","+12:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Yap","YAPT","YAPT","","","+10:00:00","+00:00:00","","","","+00:00:00"
|
||||
"Pacific/Yap","CHUT","CHUT","","","+10:00:00","+00:00:00","","","","+00:00:00"
|
||||
|
||||
|
@@ -0,0 +1,18 @@
|
||||
# Copyright (c) 2016 Rene Rivera
|
||||
#
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||
# http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
require-b2 5.2 ;
|
||||
|
||||
###############################################################################
|
||||
alias boostdoc
|
||||
: ../xmldoc/date_time.xml
|
||||
:
|
||||
: <dependency>../xmldoc//date_time_autodoc <dependency>../xmldoc//gregorian_autodoc
|
||||
<dependency>../xmldoc//posix_time_autodoc <dependency>../xmldoc//local_time_autodoc
|
||||
: ;
|
||||
explicit boostdoc ;
|
||||
alias boostrelease ;
|
||||
explicit boostrelease ;
|
||||
+32
-94
@@ -1,109 +1,47 @@
|
||||
subproject libs/date_time/example ;
|
||||
project : requirements <library>/boost/date_time//boost_date_time ;
|
||||
|
||||
local DATE_TIME_PROPERTIES = <define>BOOST_DATE_TIME_STATIC_LINK ;
|
||||
exe dates_as_strings : gregorian/dates_as_strings.cpp ;
|
||||
exe days_alive : gregorian/days_alive.cpp ;
|
||||
exe days_till_new_year : gregorian/days_till_new_year.cpp ;
|
||||
|
||||
exe days_between_new_years : gregorian/days_between_new_years.cpp ;
|
||||
exe find_last_day_of_months : gregorian/find_last_day_of_months.cpp ;
|
||||
|
||||
exe month_add : gregorian/month_add.cpp ;
|
||||
|
||||
exe localization : gregorian/localization.cpp ;
|
||||
exe print_holidays : gregorian/print_holidays.cpp ;
|
||||
exe print_month : gregorian/print_month.cpp ;
|
||||
exe period_calc : gregorian/period_calc.cpp ;
|
||||
|
||||
exe days_since_year_start : gregorian/days_since_year_start.cpp ;
|
||||
|
||||
|
||||
exe dates_as_strings : <lib>../build/boost_date_time
|
||||
gregorian/dates_as_strings.cpp
|
||||
: <include>$(BOOST_ROOT) $(DATE_TIME_PROPERTIES)
|
||||
;
|
||||
|
||||
exe days_alive : <lib>../build/boost_date_time
|
||||
gregorian/days_alive.cpp
|
||||
: <include>$(BOOST_ROOT) $(DATE_TIME_PROPERTIES)
|
||||
exe local_utc_conversion : posix_time/local_utc_conversion.cpp
|
||||
: <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
;
|
||||
|
||||
exe days_till_new_year : <lib>../build/boost_date_time
|
||||
gregorian/days_till_new_year.cpp
|
||||
: <include>$(BOOST_ROOT) $(DATE_TIME_PROPERTIES)
|
||||
exe print_hours : posix_time/print_hours.cpp
|
||||
: <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
;
|
||||
|
||||
exe days_between_new_years : <lib>../build/boost_date_time
|
||||
gregorian/days_between_new_years.cpp
|
||||
: <include>$(BOOST_ROOT) $(DATE_TIME_PROPERTIES)
|
||||
exe time_math : posix_time/time_math.cpp
|
||||
: <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
;
|
||||
|
||||
exe find_last_day_of_months : <lib>../build/boost_date_time
|
||||
gregorian/find_last_day_of_months.cpp
|
||||
: <include>$(BOOST_ROOT) $(DATE_TIME_PROPERTIES)
|
||||
;
|
||||
exe time_periods : posix_time/time_periods.cpp
|
||||
: <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
;
|
||||
|
||||
exe month_add : <lib>../build/boost_date_time
|
||||
gregorian/month_add.cpp
|
||||
: <include>$(BOOST_ROOT) $(DATE_TIME_PROPERTIES)
|
||||
;
|
||||
|
||||
exe localization : gregorian/localization.cpp
|
||||
: <include>$(BOOST_ROOT) $(DATE_TIME_PROPERTIES)
|
||||
;
|
||||
|
||||
exe print_holidays : <lib>../build/boost_date_time
|
||||
gregorian/print_holidays.cpp
|
||||
: <include>$(BOOST_ROOT) $(DATE_TIME_PROPERTIES)
|
||||
;
|
||||
|
||||
exe print_month : <lib>../build/boost_date_time
|
||||
gregorian/print_month.cpp
|
||||
: <include>$(BOOST_ROOT) $(DATE_TIME_PROPERTIES)
|
||||
;
|
||||
|
||||
exe period_calc : <lib>../build/boost_date_time
|
||||
gregorian/period_calc.cpp
|
||||
: <include>$(BOOST_ROOT) $(DATE_TIME_PROPERTIES)
|
||||
;
|
||||
|
||||
exe days_since_year_start : <lib>../build/boost_date_time
|
||||
gregorian/days_since_year_start.cpp
|
||||
: <include>$(BOOST_ROOT) $(DATE_TIME_PROPERTIES)
|
||||
;
|
||||
|
||||
exe local_utc_conversion : <lib>../build/boost_date_time
|
||||
posix_time/local_utc_conversion.cpp
|
||||
: <include>$(BOOST_ROOT) $(DATE_TIME_PROPERTIES) <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
;
|
||||
|
||||
exe print_hours : <lib>../build/boost_date_time
|
||||
posix_time/print_hours.cpp
|
||||
: <include>$(BOOST_ROOT) $(DATE_TIME_PROPERTIES) <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
;
|
||||
|
||||
exe time_math : <lib>../build/boost_date_time
|
||||
posix_time/time_math.cpp
|
||||
: <include>$(BOOST_ROOT) $(DATE_TIME_PROPERTIES) <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
;
|
||||
|
||||
exe time_periods : <lib>../build/boost_date_time
|
||||
posix_time/time_periods.cpp
|
||||
: <include>$(BOOST_ROOT) $(DATE_TIME_PROPERTIES) <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
;
|
||||
|
||||
exe simple_time_zone : <lib>../build/boost_date_time
|
||||
local_time/simple_time_zone.cpp
|
||||
: <include>$(BOOST_ROOT) $(DATE_TIME_PROPERTIES)
|
||||
;
|
||||
|
||||
exe calc_rules : <lib>../build/boost_date_time
|
||||
local_time/calc_rules.cpp
|
||||
: <include>$(BOOST_ROOT) $(DATE_TIME_PROPERTIES)
|
||||
;
|
||||
|
||||
exe seconds_since_epoch : <lib>../build/boost_date_time
|
||||
local_time/seconds_since_epoch.cpp
|
||||
: <include>$(BOOST_ROOT) $(DATE_TIME_PROPERTIES)
|
||||
;
|
||||
|
||||
exe flight : <lib>../build/boost_date_time
|
||||
local_time/flight.cpp
|
||||
: <include>$(BOOST_ROOT) $(DATE_TIME_PROPERTIES)
|
||||
;
|
||||
|
||||
exe io_tutorial : tutorial/io_tutorial.cpp
|
||||
: <include>$(BOOST_ROOT)
|
||||
;
|
||||
exe simple_time_zone : local_time/simple_time_zone.cpp ;
|
||||
exe calc_rules : local_time/calc_rules.cpp ;
|
||||
exe seconds_since_epoch : local_time/seconds_since_epoch.cpp ;
|
||||
exe flight : local_time/flight.cpp ;
|
||||
exe io_tutorial : tutorial/io_tutorial.cpp ;
|
||||
|
||||
# Copyright (c) 2002-2005
|
||||
# CrystalClear Software, Inc.
|
||||
# Subject to the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or
|
||||
# Subject to the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or
|
||||
# http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ main()
|
||||
date d(from_simple_string(s));
|
||||
std::cout << to_simple_string(d) << std::endl;
|
||||
|
||||
//Read ISO Standard(CCYYMMDD) and output ISO Extended
|
||||
//Read ISO 8601 Standard(CCYYMMDD) and output ISO 8601 Extended
|
||||
std::string ud("20011009"); //2001-Oct-09
|
||||
date d1(from_undelimited_string(ud));
|
||||
std::cout << to_iso_extended_string(d1) << std::endl;
|
||||
|
||||
@@ -3,10 +3,11 @@
|
||||
* New Years day of this year, and days until next New Years day.
|
||||
*
|
||||
* Expected results:
|
||||
* Adding together both durations will produce 366 (365 in a leap year).
|
||||
* Adding together both durations will produce 365 (366 in a leap year).
|
||||
*/
|
||||
#include <iostream>
|
||||
|
||||
#include "boost/date_time/gregorian/gregorian.hpp"
|
||||
#include <iostream>
|
||||
|
||||
int
|
||||
main()
|
||||
@@ -25,7 +26,7 @@ main()
|
||||
std::cout << "Days until next Jan 1: " << days_until_year_start.days()
|
||||
<< std::endl;
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
/* Copyright 2001-2004: CrystalClear Software, Inc
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
|
||||
#include <iostream>
|
||||
#include "boost/date_time/gregorian/gregorian.hpp"
|
||||
#include <iostream>
|
||||
|
||||
int
|
||||
main()
|
||||
@@ -14,7 +14,7 @@ main()
|
||||
std::cout << "Days since Jan 1: " << days_since_year_start.days()
|
||||
<< std::endl;
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
/* Copyright 2001-2004: CrystalClear Software, Inc
|
||||
* http://www.crystalclearsoftware.com
|
||||
|
||||
@@ -15,7 +15,7 @@ main()
|
||||
|
||||
std::cout << "Days till new year: " << dd.days() << std::endl;
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
/* Copyright 2001-2004: CrystalClear Software, Inc
|
||||
* http://www.crystalclearsoftware.com
|
||||
|
||||
@@ -15,7 +15,8 @@ main()
|
||||
|
||||
// get a month and a year from the user
|
||||
try {
|
||||
int y, m;
|
||||
greg_year::value_type y;
|
||||
greg_month::value_type m;
|
||||
std::cout << " Enter Year(ex: 2002): ";
|
||||
std::cin >> y;
|
||||
year = greg_year(y);
|
||||
@@ -23,11 +24,11 @@ main()
|
||||
std::cin >> m;
|
||||
month = greg_month(m);
|
||||
}
|
||||
catch(bad_year by) {
|
||||
catch(const bad_year& by) {
|
||||
std::cout << "Invalid Year Entered: " << by.what() << '\n'
|
||||
<< "Using minimum values for month and year." << std::endl;
|
||||
}
|
||||
catch(bad_month bm) {
|
||||
catch(const bad_month& bm) {
|
||||
std::cout << "Invalid Month Entered" << bm.what() << '\n'
|
||||
<< "Using minimum value for month. " << std::endl;
|
||||
}
|
||||
|
||||
@@ -83,7 +83,7 @@ int main()
|
||||
us_facet->format("%m/%d/%Y");
|
||||
std::cout << d1 << std::endl; // 10/01/2002
|
||||
|
||||
// English names, iso order (year-month-day), '-' separator
|
||||
// English names, ISO 8601 order (year-month-day), '-' separator
|
||||
us_facet->format("%Y-%b-%d");
|
||||
std::cout << d1 << std::endl; // 2002-Oct-01
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ main()
|
||||
date d2 = d + months(1);
|
||||
date d3 = d - months(1);
|
||||
std::cout << "Today is: " << to_simple_string(d) << ".\n"
|
||||
<< "One month from today will be: " << to_simple_string(d2)
|
||||
<< "One month from today will be: " << to_simple_string(d2) << ".\n"
|
||||
<< "One month ago was: " << to_simple_string(d3)
|
||||
<< std::endl;
|
||||
std::cout << "******** Warning read this ***********************\n";
|
||||
@@ -31,14 +31,20 @@ main()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << "\nSo what does this mean? It means the result of adding months is order\n"
|
||||
<< "dependent, non-communitive, and may create problems for applications.\n"
|
||||
<< "dependent, non-commutative, and may create problems for applications.\n"
|
||||
<< "Consider: \n"
|
||||
<< "Jan 30, 2004 + (1 month) + (1 month) != Jan 29, 2004 + (2 months)\n"
|
||||
<< "Why not? Because Jan 30, 2004 + 1 month is Feb 29 + 1 month is Mar 29th.\n"
|
||||
<< "while Jan 30, 2004 + 2 months is Mar 29th.\n"
|
||||
<< "Jan 30, 2004 + (1 month) + (1 month) != Jan 30, 2004 + (2 months)\n"
|
||||
<< "Why not? Because Jan 30, 2004 + 1 month is Feb 29 + 1 month is Mar 31st.\n"
|
||||
<< "while Jan 30, 2004 + 2 months is Mar 30th.\n"
|
||||
<< "All of this clears up as long as all the starting dates before the 28th of\n"
|
||||
<< "the month -- then all the behavior follows classical mathematical rules.\n";
|
||||
|
||||
date d6(2004, Jan, 30);
|
||||
date d7 = d6 + months(1) + months(1);
|
||||
date d8 = d6 + months(2);
|
||||
std::cout << "2004-01-30 + (1 month) + (1 month) is: " << to_simple_string(d7) << ".\n"
|
||||
<< "2004-01-30 + (2 months) is: " << to_simple_string(d8)
|
||||
<< std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -33,12 +33,12 @@ print_date(boost::gregorian::date d)
|
||||
int
|
||||
main() {
|
||||
|
||||
std::cout << "Enter Year: ";
|
||||
int year;
|
||||
std::cin >> year;
|
||||
|
||||
using namespace boost::gregorian;
|
||||
|
||||
std::cout << "Enter Year: ";
|
||||
greg_year::value_type year;
|
||||
std::cin >> year;
|
||||
|
||||
//define a collection of holidays fixed by month and day
|
||||
std::vector<year_based_generator*> holidays;
|
||||
holidays.push_back(new partial_date(1,Jan)); //Western New Year
|
||||
|
||||
@@ -19,16 +19,18 @@
|
||||
int
|
||||
main()
|
||||
{
|
||||
using namespace boost::gregorian;
|
||||
|
||||
std::cout << "Enter Year: ";
|
||||
int year, month;
|
||||
greg_year::value_type year;
|
||||
greg_month::value_type month;
|
||||
std::cin >> year;
|
||||
std::cout << "Enter Month(1..12): ";
|
||||
std::cin >> month;
|
||||
|
||||
using namespace boost::gregorian;
|
||||
try {
|
||||
//Use the calendar to get the last day of the month
|
||||
int eom_day = gregorian_calendar::end_of_month_day(year,month);
|
||||
greg_day::value_type eom_day = gregorian_calendar::end_of_month_day(year,month);
|
||||
date endOfMonth(year,month,eom_day);
|
||||
|
||||
//construct an iterator starting with firt day of the month
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
/* This example shows a program that calculates the arrival time of a plane
|
||||
* that flys from Phoenix to New York. During the flight New York shifts
|
||||
* into daylight savings time (Phoenix doesn't because Arizona doesn't use
|
||||
* dst).
|
||||
* DST).
|
||||
*
|
||||
*
|
||||
*/
|
||||
@@ -20,24 +20,34 @@ int main()
|
||||
//setup some timezones for creating and adjusting local times
|
||||
//This user editable file can be found in libs/date_time/data.
|
||||
tz_database tz_db;
|
||||
tz_db.load_from_file("date_time_zonespec.csv");
|
||||
try {
|
||||
tz_db.load_from_file("../../data/date_time_zonespec.csv");
|
||||
}catch(const data_not_accessible& dna) {
|
||||
std::cerr << "Error with time zone data file: " << dna.what() << std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}catch(const bad_field_count& bfc) {
|
||||
std::cerr << "Error with time zone data file: " << bfc.what() << std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
time_zone_ptr nyc_tz = tz_db.time_zone_from_region("America/New_York");
|
||||
//Use a
|
||||
//Use a newly created time zone rule
|
||||
time_zone_ptr phx_tz(new posix_time_zone("MST-07:00:00"));
|
||||
|
||||
//local departure time in phoenix is 11 pm on april 2 2005
|
||||
// (ny changes to dst on apr 3 at 2 am)
|
||||
local_date_time phx_departure(date(2005, Apr, 2), hours(23),
|
||||
//local departure time in Phoenix is 11 pm on March 13 2010
|
||||
// (NY changes to DST on March 14 at 2 am)
|
||||
local_date_time phx_departure(date(2010, Mar, 13), hours(23),
|
||||
phx_tz,
|
||||
local_date_time::NOT_DATE_TIME_ON_ERROR);
|
||||
local_date_time nyc_departure = phx_departure.local_time_in(nyc_tz);
|
||||
|
||||
time_duration flight_length = hours(4) + minutes(30);
|
||||
local_date_time phx_arrival = phx_departure + flight_length;
|
||||
local_date_time nyc_arrival = phx_arrival.local_time_in(nyc_tz);
|
||||
|
||||
std::cout << "departure phx time: " << phx_departure << std::endl;
|
||||
std::cout << "arrival phx time: " << phx_arrival << std::endl;
|
||||
std::cout << "arrival nyc time: " << nyc_arrival << std::endl;
|
||||
std::cout << "departure PHX time: " << phx_departure << std::endl;
|
||||
std::cout << "departure NYC time: " << nyc_departure << std::endl;
|
||||
std::cout << "arrival PHX time: " << phx_arrival << std::endl;
|
||||
std::cout << "arrival NYC time: " << nyc_arrival << std::endl;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -24,14 +24,14 @@ int main() {
|
||||
local_date_time ny_time(date(2004, Aug, 30), hours(10), nyc, true);
|
||||
|
||||
typedef boost::date_time::time_facet<local_date_time, char> ldt_facet;
|
||||
ldt_facet* timefacet = new ldt_facet("%Y-%b-%d %H:%M:%S%F %Z");
|
||||
ldt_facet* timefacet = new ldt_facet("%Y-%b-%d %H:%M:%S""%F %Z");
|
||||
std::locale loc(std::locale::classic(), timefacet);
|
||||
|
||||
std::cout << ny_time << std::endl;
|
||||
// 2004-Aug-30 00:00:00 EDT
|
||||
// 2004-Aug-30 10:00:00 EDT
|
||||
std::cout.imbue(loc);
|
||||
std::cout << ny_time << std::endl;
|
||||
// 2004-Aug-30 00:00:00 Eastern Daylight Time
|
||||
// 2004-Aug-30 10:00:00 Eastern Daylight Time
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -24,10 +24,10 @@ int main()
|
||||
tz_database tz_db;
|
||||
try {
|
||||
tz_db.load_from_file("../data/date_time_zonespec.csv");
|
||||
}catch(data_not_accessible dna) {
|
||||
}catch(const data_not_accessible& dna) {
|
||||
std::cerr << "Error with time zone data file: " << dna.what() << std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}catch(bad_field_count bfc) {
|
||||
}catch(const bad_field_count& bfc) {
|
||||
std::cerr << "Error with time zone data file: " << bfc.what() << std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
@@ -29,16 +29,16 @@ main()
|
||||
ptime now = second_clock::local_time();
|
||||
//Get the date part out of the time
|
||||
date today = now.date();
|
||||
date tommorrow = today + days(1);
|
||||
ptime tommorrow_start(tommorrow); //midnight
|
||||
date tomorrow = today + days(1);
|
||||
ptime tomorrow_start(tomorrow); //midnight
|
||||
|
||||
//iterator adds by one hour
|
||||
time_iterator titr(now,hours(1));
|
||||
for (; titr < tommorrow_start; ++titr) {
|
||||
for (; titr < tomorrow_start; ++titr) {
|
||||
std::cout << to_simple_string(*titr) << std::endl;
|
||||
}
|
||||
|
||||
time_duration remaining = tommorrow_start - now;
|
||||
time_duration remaining = tomorrow_start - now;
|
||||
std::cout << "Time left till midnight: "
|
||||
<< to_simple_string(remaining) << std::endl;
|
||||
return 0;
|
||||
|
||||
@@ -13,7 +13,7 @@ main()
|
||||
using namespace boost::gregorian;
|
||||
|
||||
date d(2002,Feb,1); //an arbitrary date
|
||||
//construct a time by adding up some durations durations
|
||||
//construct a time by adding up some durations
|
||||
ptime t1(d, hours(5)+minutes(4)+seconds(2)+milliseconds(1));
|
||||
//construct a new time by subtracting some times
|
||||
ptime t2 = t1 - hours(5)- minutes(4)- seconds(2)- milliseconds(1);
|
||||
|
||||
@@ -141,7 +141,7 @@ int main(){
|
||||
period_formatter per_formatter(period_formatter::AS_OPEN_RANGE,
|
||||
" to ", "from ", " exclusive", " inclusive" );
|
||||
period_parser per_parser(period_parser::AS_OPEN_RANGE,
|
||||
" to ", "from ", " exclusive" , "inclusive" );
|
||||
" to ", "from ", " exclusive" , " inclusive" );
|
||||
|
||||
// default output
|
||||
ss.str("");
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define _DATE_TIME_ADJUST_FUNCTORS_HPP___
|
||||
|
||||
/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
* Author: Jeff Garland, Bart Garst
|
||||
@@ -14,26 +14,21 @@
|
||||
|
||||
namespace boost {
|
||||
namespace date_time {
|
||||
|
||||
|
||||
|
||||
//! Functor to iterate a fixed number of days
|
||||
template<class date_type>
|
||||
class day_functor
|
||||
class day_functor
|
||||
{
|
||||
public:
|
||||
typedef typename date_type::duration_type duration_type;
|
||||
day_functor(int f) : f_(f) {}
|
||||
duration_type get_offset(const date_type& d) const
|
||||
duration_type get_offset(const date_type&) const
|
||||
{
|
||||
// why is 'd' a parameter???
|
||||
// fix compiler warnings
|
||||
d.year();
|
||||
return duration_type(f_);
|
||||
}
|
||||
duration_type get_neg_offset(const date_type& d) const
|
||||
duration_type get_neg_offset(const date_type&) const
|
||||
{
|
||||
// fix compiler warnings
|
||||
d.year();
|
||||
return duration_type(-f_);
|
||||
}
|
||||
private:
|
||||
@@ -43,7 +38,7 @@ namespace date_time {
|
||||
|
||||
//! Provides calculation to find next nth month given a date
|
||||
/*! This adjustment function provides the logic for 'month-based'
|
||||
* advancement on a ymd based calendar. The policy it uses
|
||||
* advancement on a ymd based calendar. The policy it uses
|
||||
* to handle the non existant end of month days is to back
|
||||
* up to the last day of the month. Also, if the starting
|
||||
* date is the last day of a month, this functor will attempt
|
||||
@@ -51,7 +46,7 @@ namespace date_time {
|
||||
|
||||
*/
|
||||
template<class date_type>
|
||||
class month_functor
|
||||
class month_functor
|
||||
{
|
||||
public:
|
||||
typedef typename date_type::duration_type duration_type;
|
||||
@@ -60,7 +55,7 @@ namespace date_time {
|
||||
typedef typename cal_type::day_type day_type;
|
||||
|
||||
month_functor(int f) : f_(f), origDayOfMonth_(0) {}
|
||||
duration_type get_offset(const date_type& d) const
|
||||
duration_type get_offset(const date_type& d) const
|
||||
{
|
||||
ymd_type ymd(d.year_month_day());
|
||||
if (origDayOfMonth_ == 0) {
|
||||
@@ -71,11 +66,9 @@ namespace date_time {
|
||||
}
|
||||
}
|
||||
typedef date_time::wrapping_int2<short,1,12> wrap_int2;
|
||||
typedef typename wrap_int2::int_type int_type;
|
||||
wrap_int2 wi(ymd.month);
|
||||
//calc the year wrap around, add() returns 0 or 1 if wrapped
|
||||
int_type year = wi.add(static_cast<int_type>(f_));
|
||||
year = static_cast<int_type>(year + ymd.year); //calculate resulting year
|
||||
const typename ymd_type::year_type year(static_cast<typename ymd_type::year_type::value_type>(ymd.year + wi.add(f_)));
|
||||
// std::cout << "trace wi: " << wi.as_int() << std::endl;
|
||||
// std::cout << "trace year: " << year << std::endl;
|
||||
//find the last day for the new month
|
||||
@@ -91,7 +84,7 @@ namespace date_time {
|
||||
return date_type(year, wi.as_int(), dayOfMonth) - d;
|
||||
}
|
||||
//! Returns a negative duration_type
|
||||
duration_type get_neg_offset(const date_type& d) const
|
||||
duration_type get_neg_offset(const date_type& d) const
|
||||
{
|
||||
ymd_type ymd(d.year_month_day());
|
||||
if (origDayOfMonth_ == 0) {
|
||||
@@ -102,11 +95,9 @@ namespace date_time {
|
||||
}
|
||||
}
|
||||
typedef date_time::wrapping_int2<short,1,12> wrap_int2;
|
||||
typedef typename wrap_int2::int_type int_type;
|
||||
wrap_int2 wi(ymd.month);
|
||||
//calc the year wrap around, add() returns 0 or 1 if wrapped
|
||||
int_type year = wi.subtract(static_cast<int_type>(f_));
|
||||
year = static_cast<int_type>(year + ymd.year); //calculate resulting year
|
||||
const typename ymd_type::year_type year(static_cast<typename ymd_type::year_type::value_type>(ymd.year + wi.subtract(f_)));
|
||||
//find the last day for the new month
|
||||
day_type resultingEndOfMonthDay(cal_type::end_of_month_day(year, wi.as_int()));
|
||||
//original was the end of month -- force to last day of month
|
||||
@@ -127,24 +118,19 @@ namespace date_time {
|
||||
|
||||
//! Functor to iterate a over weeks
|
||||
template<class date_type>
|
||||
class week_functor
|
||||
class week_functor
|
||||
{
|
||||
public:
|
||||
typedef typename date_type::duration_type duration_type;
|
||||
typedef typename date_type::calendar_type calendar_type;
|
||||
week_functor(int f) : f_(f) {}
|
||||
duration_type get_offset(const date_type& d) const
|
||||
duration_type get_offset(const date_type&) const
|
||||
{
|
||||
// why is 'd' a parameter???
|
||||
// fix compiler warnings
|
||||
d.year();
|
||||
return duration_type(f_*calendar_type::days_in_week());
|
||||
return duration_type(f_*static_cast<int>(calendar_type::days_in_week()));
|
||||
}
|
||||
duration_type get_neg_offset(const date_type& d) const
|
||||
duration_type get_neg_offset(const date_type&) const
|
||||
{
|
||||
// fix compiler warnings
|
||||
d.year();
|
||||
return duration_type(-f_*calendar_type::days_in_week());
|
||||
return duration_type(-f_*static_cast<int>(calendar_type::days_in_week()));
|
||||
}
|
||||
private:
|
||||
int f_;
|
||||
@@ -152,17 +138,17 @@ namespace date_time {
|
||||
|
||||
//! Functor to iterate by a year adjusting for leap years
|
||||
template<class date_type>
|
||||
class year_functor
|
||||
class year_functor
|
||||
{
|
||||
public:
|
||||
//typedef typename date_type::year_type year_type;
|
||||
typedef typename date_type::duration_type duration_type;
|
||||
year_functor(int f) : _mf(f * 12) {}
|
||||
duration_type get_offset(const date_type& d) const
|
||||
duration_type get_offset(const date_type& d) const
|
||||
{
|
||||
return _mf.get_offset(d);
|
||||
}
|
||||
duration_type get_neg_offset(const date_type& d) const
|
||||
duration_type get_neg_offset(const date_type& d) const
|
||||
{
|
||||
return _mf.get_neg_offset(d);
|
||||
}
|
||||
@@ -170,7 +156,7 @@ namespace date_time {
|
||||
month_functor<date_type> _mf;
|
||||
};
|
||||
|
||||
|
||||
|
||||
} }//namespace date_time
|
||||
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include <boost/throw_exception.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/c_time.hpp>
|
||||
#include <boost/numeric/conversion/cast.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace date_time {
|
||||
@@ -42,9 +43,14 @@ namespace date_time {
|
||||
}
|
||||
date_duration_type dd = t.date() - time_t_start_day;
|
||||
time_duration_type td = t.time_of_day();
|
||||
std::time_t t2 = dd.days()*86400 + td.hours()*3600 + td.minutes()*60 + td.seconds();
|
||||
uint64_t t2 = static_cast<uint64_t>(dd.days())*86400 +
|
||||
static_cast<uint64_t>(td.hours())*3600 +
|
||||
static_cast<uint64_t>(td.minutes())*60 +
|
||||
td.seconds();
|
||||
// detect y2038 issue and throw instead of proceed with bad time
|
||||
std::time_t tv = boost::numeric_cast<std::time_t>(t2);
|
||||
std::tm tms, *tms_ptr;
|
||||
tms_ptr = c_time::localtime(&t2, &tms);
|
||||
tms_ptr = c_time::localtime(&tv, &tms);
|
||||
date_type d(static_cast<unsigned short>(tms_ptr->tm_year + 1900),
|
||||
static_cast<unsigned short>(tms_ptr->tm_mon + 1),
|
||||
static_cast<unsigned short>(tms_ptr->tm_mday));
|
||||
|
||||
@@ -57,7 +57,15 @@ namespace date_time {
|
||||
static std::tm* localtime(const std::time_t* t, std::tm* result)
|
||||
{
|
||||
// localtime_r() not in namespace std???
|
||||
#if defined(__VMS) && __INITIAL_POINTER_SIZE == 64
|
||||
std::tm tmp;
|
||||
if(!localtime_r(t,&tmp))
|
||||
result = 0;
|
||||
else
|
||||
*result = tmp;
|
||||
#else
|
||||
result = localtime_r(t, result);
|
||||
#endif
|
||||
if (!result)
|
||||
boost::throw_exception(std::runtime_error("could not convert calendar time to local time"));
|
||||
return result;
|
||||
@@ -67,17 +75,28 @@ namespace date_time {
|
||||
static std::tm* gmtime(const std::time_t* t, std::tm* result)
|
||||
{
|
||||
// gmtime_r() not in namespace std???
|
||||
#if defined(__VMS) && __INITIAL_POINTER_SIZE == 64
|
||||
std::tm tmp;
|
||||
if(!gmtime_r(t,&tmp))
|
||||
result = 0;
|
||||
else
|
||||
*result = tmp;
|
||||
#else
|
||||
result = gmtime_r(t, result);
|
||||
#endif
|
||||
if (!result)
|
||||
boost::throw_exception(std::runtime_error("could not convert calendar time to UTC time"));
|
||||
return result;
|
||||
}
|
||||
#else // BOOST_HAS_THREADS
|
||||
#else // BOOST_DATE_TIME_HAS_REENTRANT_STD_FUNCTIONS
|
||||
|
||||
#if (defined(_MSC_VER) && (_MSC_VER >= 1400))
|
||||
#if defined(__clang__) // Clang has to be checked before MSVC
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
||||
#elif (defined(_MSC_VER) && (_MSC_VER >= 1400))
|
||||
#pragma warning(push) // preserve warning settings
|
||||
#pragma warning(disable : 4996) // disable depricated localtime/gmtime warning on vc8
|
||||
#endif // _MSC_VER >= 1400
|
||||
#endif
|
||||
//! requires a pointer to a user created std::tm struct
|
||||
inline
|
||||
static std::tm* localtime(const std::time_t* t, std::tm* result)
|
||||
@@ -96,11 +115,13 @@ namespace date_time {
|
||||
boost::throw_exception(std::runtime_error("could not convert calendar time to UTC time"));
|
||||
return result;
|
||||
}
|
||||
#if (defined(_MSC_VER) && (_MSC_VER >= 1400))
|
||||
#if defined(__clang__) // Clang has to be checked before MSVC
|
||||
#pragma clang diagnostic pop
|
||||
#elif (defined(_MSC_VER) && (_MSC_VER >= 1400))
|
||||
#pragma warning(pop) // restore warnings to previous state
|
||||
#endif // _MSC_VER >= 1400
|
||||
#endif
|
||||
|
||||
#endif // BOOST_HAS_THREADS
|
||||
#endif // BOOST_DATE_TIME_HAS_REENTRANT_STD_FUNCTIONS
|
||||
};
|
||||
}} // namespaces
|
||||
|
||||
|
||||
@@ -12,19 +12,6 @@
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
|
||||
// With boost release 1.33, date_time will be using a different,
|
||||
// more flexible, IO system. This new system is not compatible with
|
||||
// old compilers. The original date_time IO system remains for those
|
||||
// compilers. They must define this macro to use the legacy IO.
|
||||
// (defined(__BORLANDC__) && (__BORLANDC__ <= 0x0581) ) ) &&
|
||||
#if( BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x581) ) \
|
||||
|| BOOST_WORKAROUND( __GNUC__, < 3) \
|
||||
|| (BOOST_WORKAROUND( _MSC_VER, <= 1300) ) \
|
||||
) \
|
||||
&& !defined(USE_DATE_TIME_PRE_1_33_FACET_IO)
|
||||
# define USE_DATE_TIME_PRE_1_33_FACET_IO
|
||||
#endif
|
||||
|
||||
|
||||
// This file performs some local compiler configurations
|
||||
|
||||
@@ -41,12 +28,8 @@
|
||||
|
||||
// Include extensions to date_duration - comment out to remove this feature
|
||||
#define BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES
|
||||
// these extensions are known to cause problems with gcc295
|
||||
#if defined(__GNUC__) && (__GNUC__ < 3)
|
||||
#undef BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES
|
||||
#endif
|
||||
|
||||
#if (defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION) || BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x581) ) )
|
||||
#if (defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION) || BOOST_WORKAROUND( BOOST_BORLANDC, BOOST_TESTED_AT(0x581) ) )
|
||||
#define BOOST_DATE_TIME_NO_MEMBER_INIT
|
||||
#endif
|
||||
|
||||
@@ -60,13 +43,13 @@
|
||||
|
||||
|
||||
/* Workaround for Borland iterator error. Error was "Cannot convert 'istream *' to 'wistream *' in function istream_iterator<>::istream_iterator() */
|
||||
#if defined(__BORLANDC__) && defined(BOOST_BCB_WITH_RW_LIB)
|
||||
#if defined(BOOST_BORLANDC) && defined(BOOST_BCB_WITH_RW_LIB)
|
||||
#define BOOST_DATE_TIME_NO_WISTREAM_ITERATOR
|
||||
#endif
|
||||
|
||||
|
||||
// Borland v5.64 does not have the following in std namespace; v5.5.1 does
|
||||
#if defined(__BORLANDC__) && defined(BOOST_BCB_WITH_STLPORT)
|
||||
#if defined(BOOST_BORLANDC) && defined(BOOST_BCB_WITH_STLPORT)
|
||||
#include <locale>
|
||||
namespace std {
|
||||
using stlport::tolower;
|
||||
@@ -83,7 +66,7 @@ namespace std {
|
||||
#if (((defined(__GNUC__) && (__GNUC__ < 3)) || \
|
||||
(defined(_MSC_VER) && (_MSC_VER < 1300)) ) && \
|
||||
!defined(_STLP_OWN_IOSTREAMS) ) || \
|
||||
BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x581) )
|
||||
BOOST_WORKAROUND( BOOST_BORLANDC, BOOST_TESTED_AT(0x581) )
|
||||
#define BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS
|
||||
#endif
|
||||
|
||||
@@ -118,46 +101,24 @@ namespace std {
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef BOOST_HAS_DECLSPEC // defined in config system
|
||||
// we need to import/export our code only if the user has specifically
|
||||
// asked for it by defining either BOOST_ALL_DYN_LINK if they want all boost
|
||||
// libraries to be dynamically linked, or BOOST_DATE_TIME_DYN_LINK
|
||||
// if they want just this one to be dynamically liked:
|
||||
# if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_DATE_TIME_DYN_LINK)
|
||||
// export if this is our own source, otherwise import:
|
||||
# ifdef BOOST_DATE_TIME_SOURCE
|
||||
# define BOOST_DATE_TIME_DECL __declspec(dllexport)
|
||||
# else
|
||||
# define BOOST_DATE_TIME_DECL __declspec(dllimport)
|
||||
# endif // BOOST_DATE_TIME_SOURCE
|
||||
# endif // DYN_LINK
|
||||
#endif // BOOST_HAS_DECLSPEC
|
||||
// we need to import/export our code only if the user has specifically
|
||||
// asked for it by defining either BOOST_ALL_DYN_LINK if they want all boost
|
||||
// libraries to be dynamically linked, or BOOST_DATE_TIME_DYN_LINK
|
||||
// if they want just this one to be dynamically liked:
|
||||
#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_DATE_TIME_DYN_LINK)
|
||||
// export if this is our own source, otherwise import:
|
||||
# ifdef BOOST_DATE_TIME_SOURCE
|
||||
# define BOOST_DATE_TIME_DECL BOOST_SYMBOL_EXPORT
|
||||
# else
|
||||
# define BOOST_DATE_TIME_DECL BOOST_SYMBOL_IMPORT
|
||||
# endif // BOOST_DATE_TIME_SOURCE
|
||||
#endif // DYN_LINK
|
||||
//
|
||||
// if BOOST_WHATEVER_DECL isn't defined yet define it now:
|
||||
#ifndef BOOST_DATE_TIME_DECL
|
||||
# define BOOST_DATE_TIME_DECL
|
||||
#endif
|
||||
|
||||
//
|
||||
// Automatically link to the correct build variant where possible.
|
||||
//
|
||||
#if !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_DATE_TIME_NO_LIB) && !defined(BOOST_DATE_TIME_SOURCE)
|
||||
//
|
||||
// Set the name of our library, this will get undef'ed by auto_link.hpp
|
||||
// once it's done with it:
|
||||
//
|
||||
#define BOOST_LIB_NAME boost_date_time
|
||||
//
|
||||
// If we're importing code from a dll, then tell auto_link.hpp about it:
|
||||
//
|
||||
#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_DATE_TIME_DYN_LINK)
|
||||
# define BOOST_DYN_LINK
|
||||
#endif
|
||||
//
|
||||
// And include the header that does the work:
|
||||
//
|
||||
#include <boost/config/auto_link.hpp>
|
||||
#endif // auto-linking disabled
|
||||
|
||||
#if defined(BOOST_HAS_THREADS)
|
||||
# if defined(_MSC_VER) || defined(__MWERKS__) || defined(__MINGW32__) || defined(__BORLANDC__)
|
||||
@@ -167,5 +128,10 @@ namespace std {
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_NO_CXX11_NULLPTR)
|
||||
# define BOOST_DATE_TIME_NULLPTR 0
|
||||
#else
|
||||
# define BOOST_DATE_TIME_NULLPTR nullptr
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#include <stdexcept>
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/throw_exception.hpp>
|
||||
#include <boost/mpl/if.hpp>
|
||||
#include <boost/type_traits/conditional.hpp>
|
||||
#include <boost/type_traits/is_base_of.hpp>
|
||||
|
||||
namespace boost {
|
||||
@@ -39,29 +39,33 @@ namespace CV {
|
||||
*
|
||||
*/
|
||||
template<class value_policies>
|
||||
class constrained_value {
|
||||
class BOOST_SYMBOL_VISIBLE constrained_value {
|
||||
public:
|
||||
typedef typename value_policies::value_type value_type;
|
||||
// typedef except_type exception_type;
|
||||
constrained_value(value_type value) : value_((min)())
|
||||
BOOST_CXX14_CONSTEXPR constrained_value(value_type value) : value_((min)())
|
||||
{
|
||||
assign(value);
|
||||
}
|
||||
constrained_value& operator=(value_type v)
|
||||
BOOST_CXX14_CONSTEXPR constrained_value& operator=(value_type v)
|
||||
{
|
||||
assign(v);
|
||||
return *this;
|
||||
}
|
||||
//! Return the max allowed value (traits method)
|
||||
static value_type max BOOST_PREVENT_MACRO_SUBSTITUTION () {return (value_policies::max)();}
|
||||
static BOOST_CONSTEXPR value_type
|
||||
max BOOST_PREVENT_MACRO_SUBSTITUTION () {return (value_policies::max)();}
|
||||
|
||||
//! Return the min allowed value (traits method)
|
||||
static value_type min BOOST_PREVENT_MACRO_SUBSTITUTION () {return (value_policies::min)();}
|
||||
static BOOST_CONSTEXPR value_type
|
||||
min BOOST_PREVENT_MACRO_SUBSTITUTION () {return (value_policies::min)();}
|
||||
|
||||
//! Coerce into the representation type
|
||||
operator value_type() const {return value_;}
|
||||
BOOST_CXX14_CONSTEXPR operator value_type() const {return value_;}
|
||||
protected:
|
||||
value_type value_;
|
||||
private:
|
||||
void assign(value_type value)
|
||||
BOOST_CXX14_CONSTEXPR void assign(value_type value)
|
||||
{
|
||||
//adding 1 below gets rid of a compiler warning which occurs when the
|
||||
//min_value is 0 and the type is unsigned....
|
||||
@@ -80,9 +84,9 @@ namespace CV {
|
||||
//! Template to shortcut the constrained_value policy creation process
|
||||
template<typename rep_type, rep_type min_value,
|
||||
rep_type max_value, class exception_type>
|
||||
class simple_exception_policy
|
||||
class BOOST_SYMBOL_VISIBLE simple_exception_policy
|
||||
{
|
||||
struct exception_wrapper : public exception_type
|
||||
struct BOOST_SYMBOL_VISIBLE exception_wrapper : public exception_type
|
||||
{
|
||||
// In order to support throw_exception mechanism in the BOOST_NO_EXCEPTIONS mode,
|
||||
// we'll have to provide a way to acquire std::exception from the exception being thrown.
|
||||
@@ -95,16 +99,20 @@ namespace CV {
|
||||
}
|
||||
};
|
||||
|
||||
typedef typename mpl::if_<
|
||||
is_base_of< std::exception, exception_type >,
|
||||
typedef typename conditional<
|
||||
is_base_of< std::exception, exception_type >::value,
|
||||
exception_type,
|
||||
exception_wrapper
|
||||
>::type actual_exception_type;
|
||||
|
||||
public:
|
||||
typedef rep_type value_type;
|
||||
static rep_type min BOOST_PREVENT_MACRO_SUBSTITUTION () { return min_value; }
|
||||
static rep_type max BOOST_PREVENT_MACRO_SUBSTITUTION () { return max_value; }
|
||||
static BOOST_CONSTEXPR rep_type
|
||||
min BOOST_PREVENT_MACRO_SUBSTITUTION () { return min_value; }
|
||||
|
||||
static BOOST_CONSTEXPR rep_type
|
||||
max BOOST_PREVENT_MACRO_SUBSTITUTION () { return max_value; }
|
||||
|
||||
static void on_error(rep_type, rep_type, violation_enum)
|
||||
{
|
||||
boost::throw_exception(actual_exception_type());
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
*/
|
||||
|
||||
#include <boost/operators.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/year_month_day.hpp>
|
||||
#include <boost/date_time/special_defs.hpp>
|
||||
|
||||
@@ -20,7 +21,7 @@ namespace date_time {
|
||||
/*!
|
||||
The date template represents an interface shell for a date class
|
||||
that is based on a year-month-day system such as the gregorian
|
||||
or iso systems. It provides basic operations to enable calculation
|
||||
or ISO 8601 systems. It provides basic operations to enable calculation
|
||||
and comparisons.
|
||||
|
||||
<b>Theory</b>
|
||||
@@ -50,7 +51,7 @@ namespace date_time {
|
||||
|
||||
|
||||
template<class T, class calendar, class duration_type_>
|
||||
class date : private
|
||||
class BOOST_SYMBOL_VISIBLE date : private
|
||||
boost::less_than_comparable<T
|
||||
, boost::equality_comparable<T
|
||||
> >
|
||||
@@ -67,76 +68,76 @@ namespace date_time {
|
||||
typedef typename calendar::date_rep_type date_rep_type;
|
||||
typedef typename calendar::date_int_type date_int_type;
|
||||
typedef typename calendar::day_of_week_type day_of_week_type;
|
||||
date(year_type y, month_type m, day_type d)
|
||||
BOOST_CXX14_CONSTEXPR date(year_type y, month_type m, day_type d)
|
||||
: days_(calendar::day_number(ymd_type(y, m, d)))
|
||||
{}
|
||||
date(const ymd_type& ymd)
|
||||
BOOST_CXX14_CONSTEXPR date(const ymd_type& ymd)
|
||||
: days_(calendar::day_number(ymd))
|
||||
{}
|
||||
//let the compiler write copy, assignment, and destructor
|
||||
year_type year() const
|
||||
BOOST_CXX14_CONSTEXPR year_type year() const
|
||||
{
|
||||
ymd_type ymd = calendar::from_day_number(days_);
|
||||
return ymd.year;
|
||||
}
|
||||
month_type month() const
|
||||
BOOST_CXX14_CONSTEXPR month_type month() const
|
||||
{
|
||||
ymd_type ymd = calendar::from_day_number(days_);
|
||||
return ymd.month;
|
||||
}
|
||||
day_type day() const
|
||||
BOOST_CXX14_CONSTEXPR day_type day() const
|
||||
{
|
||||
ymd_type ymd = calendar::from_day_number(days_);
|
||||
return ymd.day;
|
||||
}
|
||||
day_of_week_type day_of_week() const
|
||||
BOOST_CXX14_CONSTEXPR day_of_week_type day_of_week() const
|
||||
{
|
||||
ymd_type ymd = calendar::from_day_number(days_);
|
||||
return calendar::day_of_week(ymd);
|
||||
}
|
||||
ymd_type year_month_day() const
|
||||
BOOST_CXX14_CONSTEXPR ymd_type year_month_day() const
|
||||
{
|
||||
return calendar::from_day_number(days_);
|
||||
}
|
||||
bool operator<(const date_type& rhs) const
|
||||
BOOST_CONSTEXPR bool operator<(const date_type& rhs) const
|
||||
{
|
||||
return days_ < rhs.days_;
|
||||
}
|
||||
bool operator==(const date_type& rhs) const
|
||||
BOOST_CONSTEXPR bool operator==(const date_type& rhs) const
|
||||
{
|
||||
return days_ == rhs.days_;
|
||||
}
|
||||
//! check to see if date is a special value
|
||||
bool is_special()const
|
||||
BOOST_CONSTEXPR bool is_special()const
|
||||
{
|
||||
return(is_not_a_date() || is_infinity());
|
||||
}
|
||||
//! check to see if date is not a value
|
||||
bool is_not_a_date() const
|
||||
BOOST_CONSTEXPR bool is_not_a_date() const
|
||||
{
|
||||
return traits_type::is_not_a_number(days_);
|
||||
}
|
||||
//! check to see if date is one of the infinity values
|
||||
bool is_infinity() const
|
||||
BOOST_CONSTEXPR bool is_infinity() const
|
||||
{
|
||||
return traits_type::is_inf(days_);
|
||||
}
|
||||
//! check to see if date is greater than all possible dates
|
||||
bool is_pos_infinity() const
|
||||
BOOST_CONSTEXPR bool is_pos_infinity() const
|
||||
{
|
||||
return traits_type::is_pos_inf(days_);
|
||||
}
|
||||
//! check to see if date is greater than all possible dates
|
||||
bool is_neg_infinity() const
|
||||
BOOST_CONSTEXPR bool is_neg_infinity() const
|
||||
{
|
||||
return traits_type::is_neg_inf(days_);
|
||||
}
|
||||
//! return as a special value or a not_special if a normal date
|
||||
special_values as_special() const
|
||||
BOOST_CXX14_CONSTEXPR special_values as_special() const
|
||||
{
|
||||
return traits_type::to_special(days_);
|
||||
}
|
||||
duration_type operator-(const date_type& d) const
|
||||
BOOST_CXX14_CONSTEXPR duration_type operator-(const date_type& d) const
|
||||
{
|
||||
if (!this->is_special() && !d.is_special())
|
||||
{
|
||||
@@ -153,33 +154,33 @@ namespace date_time {
|
||||
}
|
||||
}
|
||||
|
||||
date_type operator-(const duration_type& dd) const
|
||||
BOOST_CXX14_CONSTEXPR date_type operator-(const duration_type& dd) const
|
||||
{
|
||||
if(dd.is_special())
|
||||
{
|
||||
return date_type(date_rep_type(days_) - dd.get_rep());
|
||||
}
|
||||
return date_type(date_rep_type(days_) - dd.days());
|
||||
return date_type(date_rep_type(days_) - static_cast<date_int_type>(dd.days()));
|
||||
}
|
||||
date_type operator-=(const duration_type& dd)
|
||||
BOOST_CXX14_CONSTEXPR date_type operator-=(const duration_type& dd)
|
||||
{
|
||||
*this = *this - dd;
|
||||
return date_type(days_);
|
||||
}
|
||||
date_rep_type day_count() const
|
||||
BOOST_CONSTEXPR date_rep_type day_count() const
|
||||
{
|
||||
return days_;
|
||||
}
|
||||
//allow internal access from operators
|
||||
date_type operator+(const duration_type& dd) const
|
||||
BOOST_CXX14_CONSTEXPR date_type operator+(const duration_type& dd) const
|
||||
{
|
||||
if(dd.is_special())
|
||||
{
|
||||
return date_type(date_rep_type(days_) + dd.get_rep());
|
||||
}
|
||||
return date_type(date_rep_type(days_) + dd.days());
|
||||
return date_type(date_rep_type(days_) + static_cast<date_int_type>(dd.days()));
|
||||
}
|
||||
date_type operator+=(const duration_type& dd)
|
||||
BOOST_CXX14_CONSTEXPR date_type operator+=(const duration_type& dd)
|
||||
{
|
||||
*this = *this + dd;
|
||||
return date_type(days_);
|
||||
@@ -191,8 +192,8 @@ namespace date_time {
|
||||
dates. It is not exposed to users since that would require class
|
||||
users to understand the inner workings of the date class.
|
||||
*/
|
||||
explicit date(date_int_type days) : days_(days) {};
|
||||
explicit date(date_rep_type days) : days_(days.as_number()) {};
|
||||
BOOST_CONSTEXPR explicit date(date_int_type days) : days_(days) {}
|
||||
BOOST_CXX14_CONSTEXPR explicit date(date_rep_type days) : days_(days.as_number()) {}
|
||||
date_int_type days_;
|
||||
|
||||
};
|
||||
|
||||
@@ -36,18 +36,18 @@ namespace date_time {
|
||||
{
|
||||
::std::tm result;
|
||||
::std::tm* curr = get_local_time(result);
|
||||
return ymd_type(curr->tm_year + 1900,
|
||||
curr->tm_mon + 1,
|
||||
curr->tm_mday);
|
||||
return ymd_type(static_cast<unsigned short>(curr->tm_year + 1900),
|
||||
static_cast<unsigned short>(curr->tm_mon + 1),
|
||||
static_cast<unsigned short>(curr->tm_mday));
|
||||
}
|
||||
//! Get the current day in universal date as a ymd_type
|
||||
static typename date_type::ymd_type universal_day_ymd()
|
||||
{
|
||||
::std::tm result;
|
||||
::std::tm* curr = get_universal_time(result);
|
||||
return ymd_type(curr->tm_year + 1900,
|
||||
curr->tm_mon + 1,
|
||||
curr->tm_mday);
|
||||
return ymd_type(static_cast<unsigned short>(curr->tm_year + 1900),
|
||||
static_cast<unsigned short>(curr->tm_mon + 1),
|
||||
static_cast<unsigned short>(curr->tm_mday));
|
||||
}
|
||||
//! Get the UTC day as a date type
|
||||
static date_type universal_day()
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define DATE_TIME_DATE_DURATION__
|
||||
|
||||
/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
* Author: Jeff Garland, Bart Garst
|
||||
@@ -12,6 +12,8 @@
|
||||
|
||||
#include <boost/operators.hpp>
|
||||
#include <boost/date_time/special_defs.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/int_adapter.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace date_time {
|
||||
@@ -19,59 +21,57 @@ namespace date_time {
|
||||
|
||||
//! Duration type with date level resolution
|
||||
template<class duration_rep_traits>
|
||||
class date_duration : private
|
||||
class BOOST_SYMBOL_VISIBLE date_duration : private
|
||||
boost::less_than_comparable1< date_duration< duration_rep_traits >
|
||||
, boost::equality_comparable1< date_duration< duration_rep_traits >
|
||||
, boost::addable1< date_duration< duration_rep_traits >
|
||||
, boost::subtractable1< date_duration< duration_rep_traits >
|
||||
, boost::dividable2< date_duration< duration_rep_traits >, int
|
||||
> > > > >
|
||||
{
|
||||
{
|
||||
public:
|
||||
typedef typename duration_rep_traits::int_type duration_rep_type;
|
||||
typedef typename duration_rep_traits::impl_type duration_rep;
|
||||
|
||||
|
||||
//! Construct from a day count
|
||||
explicit date_duration(duration_rep day_count) : days_(day_count) {};
|
||||
|
||||
BOOST_CXX14_CONSTEXPR explicit date_duration(duration_rep day_count) : days_(day_count) {}
|
||||
|
||||
/*! construct from special_values - only works when
|
||||
* instantiated with duration_traits_adapted */
|
||||
date_duration(special_values sv) :
|
||||
BOOST_CXX14_CONSTEXPR date_duration(special_values sv) :
|
||||
days_(duration_rep::from_special(sv))
|
||||
{}
|
||||
|
||||
// copy constructor required for addable<> & subtractable<>
|
||||
//! Construct from another date_duration (Copy Constructor)
|
||||
date_duration(const date_duration<duration_rep_traits>& other) :
|
||||
days_(other.days_)
|
||||
{}
|
||||
|
||||
//! returns days_ as it's instantiated type - used for streaming
|
||||
duration_rep get_rep()const
|
||||
BOOST_CXX14_CONSTEXPR duration_rep get_rep()const
|
||||
{
|
||||
return days_;
|
||||
}
|
||||
bool is_special()const
|
||||
BOOST_CXX14_CONSTEXPR special_values as_special() const
|
||||
{
|
||||
return days_.as_special();
|
||||
}
|
||||
BOOST_CXX14_CONSTEXPR bool is_special()const
|
||||
{
|
||||
return days_.is_special();
|
||||
}
|
||||
//! returns days as value, not object.
|
||||
duration_rep_type days() const
|
||||
BOOST_CXX14_CONSTEXPR duration_rep_type days() const
|
||||
{
|
||||
return duration_rep_traits::as_number(days_);
|
||||
}
|
||||
//! Returns the smallest duration -- used by to calculate 'end'
|
||||
static date_duration unit()
|
||||
static BOOST_CXX14_CONSTEXPR date_duration unit()
|
||||
{
|
||||
return date_duration<duration_rep_traits>(1);
|
||||
}
|
||||
//! Equality
|
||||
bool operator==(const date_duration& rhs) const
|
||||
BOOST_CXX14_CONSTEXPR bool operator==(const date_duration& rhs) const
|
||||
{
|
||||
return days_ == rhs.days_;
|
||||
}
|
||||
//! Less
|
||||
bool operator<(const date_duration& rhs) const
|
||||
BOOST_CXX14_CONSTEXPR bool operator<(const date_duration& rhs) const
|
||||
{
|
||||
return days_ < rhs.days_;
|
||||
}
|
||||
@@ -82,33 +82,33 @@ namespace date_time {
|
||||
* so this will not compile */
|
||||
|
||||
//! Subtract another duration -- result is signed
|
||||
date_duration& operator-=(const date_duration& rhs)
|
||||
BOOST_CXX14_CONSTEXPR date_duration& operator-=(const date_duration& rhs)
|
||||
{
|
||||
//days_ -= rhs.days_;
|
||||
days_ = days_ - rhs.days_;
|
||||
return *this;
|
||||
}
|
||||
//! Add a duration -- result is signed
|
||||
date_duration& operator+=(const date_duration& rhs)
|
||||
BOOST_CXX14_CONSTEXPR date_duration& operator+=(const date_duration& rhs)
|
||||
{
|
||||
days_ = days_ + rhs.days_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
//! unary- Allows for dd = -date_duration(2); -> dd == -2
|
||||
date_duration operator-() const
|
||||
BOOST_CXX14_CONSTEXPR date_duration operator-() const
|
||||
{
|
||||
return date_duration<duration_rep_traits>(get_rep() * (-1));
|
||||
}
|
||||
//! Division operations on a duration with an integer.
|
||||
date_duration& operator/=(int divisor)
|
||||
BOOST_CXX14_CONSTEXPR date_duration& operator/=(int divisor)
|
||||
{
|
||||
days_ = days_ / divisor;
|
||||
return *this;
|
||||
}
|
||||
|
||||
//! return sign information
|
||||
bool is_negative() const
|
||||
BOOST_CXX14_CONSTEXPR bool is_negative() const
|
||||
{
|
||||
return days_ < 0;
|
||||
}
|
||||
@@ -121,23 +121,23 @@ namespace date_time {
|
||||
/*! Struct for instantiating date_duration with <b>NO</b> special values
|
||||
* functionality. Allows for transparent implementation of either
|
||||
* date_duration<long> or date_duration<int_adapter<long> > */
|
||||
struct duration_traits_long
|
||||
struct BOOST_SYMBOL_VISIBLE duration_traits_long
|
||||
{
|
||||
typedef long int_type;
|
||||
typedef long impl_type;
|
||||
static int_type as_number(impl_type i) { return i; };
|
||||
static BOOST_CXX14_CONSTEXPR int_type as_number(impl_type i) { return i; }
|
||||
};
|
||||
|
||||
/*! Struct for instantiating date_duration <b>WITH</b> special values
|
||||
* functionality. Allows for transparent implementation of either
|
||||
* date_duration<long> or date_duration<int_adapter<long> > */
|
||||
struct duration_traits_adapted
|
||||
struct BOOST_SYMBOL_VISIBLE duration_traits_adapted
|
||||
{
|
||||
typedef long int_type;
|
||||
typedef boost::date_time::int_adapter<long> impl_type;
|
||||
static int_type as_number(impl_type i) { return i.as_number(); };
|
||||
static BOOST_CXX14_CONSTEXPR int_type as_number(impl_type i) { return i.as_number(); }
|
||||
};
|
||||
|
||||
|
||||
|
||||
} } //namspace date_time
|
||||
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
* Author: Jeff Garland, Bart Garst
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/int_adapter.hpp>
|
||||
#include <boost/date_time/special_defs.hpp>
|
||||
#include <boost/date_time/date_duration.hpp>
|
||||
@@ -19,17 +20,17 @@ namespace date_time {
|
||||
|
||||
//! Additional duration type that represents a number of n*7 days
|
||||
template <class duration_config>
|
||||
class weeks_duration : public date_duration<duration_config> {
|
||||
class BOOST_SYMBOL_VISIBLE weeks_duration : public date_duration<duration_config> {
|
||||
public:
|
||||
weeks_duration(typename duration_config::impl_type w)
|
||||
BOOST_CXX14_CONSTEXPR weeks_duration(typename duration_config::impl_type w)
|
||||
: date_duration<duration_config>(w * 7) {}
|
||||
weeks_duration(special_values sv)
|
||||
BOOST_CXX14_CONSTEXPR weeks_duration(special_values sv)
|
||||
: date_duration<duration_config>(sv) {}
|
||||
};
|
||||
|
||||
// predeclare
|
||||
template<class t>
|
||||
class years_duration;
|
||||
class BOOST_SYMBOL_VISIBLE years_duration;
|
||||
|
||||
//! additional duration type that represents a logical month
|
||||
/*! A logical month enables things like: "date(2002,Mar,2) + months(2) ->
|
||||
@@ -37,7 +38,7 @@ namespace date_time {
|
||||
* also be a last-day-of-the-month.
|
||||
*/
|
||||
template<class base_config>
|
||||
class months_duration
|
||||
class BOOST_SYMBOL_VISIBLE months_duration
|
||||
{
|
||||
private:
|
||||
typedef typename base_config::int_rep int_rep;
|
||||
@@ -48,106 +49,104 @@ namespace date_time {
|
||||
typedef months_duration<base_config> months_type;
|
||||
typedef years_duration<base_config> years_type;
|
||||
public:
|
||||
months_duration(int_rep num) : _m(num) {}
|
||||
months_duration(special_values sv) : _m(sv)
|
||||
BOOST_CXX14_CONSTEXPR months_duration(int_rep num) : _m(num) {}
|
||||
BOOST_CXX14_CONSTEXPR months_duration(special_values sv) : _m(sv)
|
||||
{
|
||||
_m = int_rep::from_special(sv);
|
||||
}
|
||||
int_rep number_of_months() const { return _m; }
|
||||
//! returns a negative duration
|
||||
duration_type get_neg_offset(const date_type& d) const
|
||||
BOOST_CXX14_CONSTEXPR duration_type get_neg_offset(const date_type& d) const
|
||||
{
|
||||
month_adjustor_type m_adj(_m.as_number());
|
||||
return duration_type(m_adj.get_neg_offset(d));
|
||||
}
|
||||
duration_type get_offset(const date_type& d) const
|
||||
BOOST_CXX14_CONSTEXPR duration_type get_offset(const date_type& d) const
|
||||
{
|
||||
month_adjustor_type m_adj(_m.as_number());
|
||||
return duration_type(m_adj.get_offset(d));
|
||||
}
|
||||
bool operator==(const months_type& rhs) const
|
||||
BOOST_CONSTEXPR bool operator==(const months_type& rhs) const
|
||||
{
|
||||
return(_m == rhs._m);
|
||||
}
|
||||
bool operator!=(const months_type& rhs) const
|
||||
BOOST_CONSTEXPR bool operator!=(const months_type& rhs) const
|
||||
{
|
||||
return(_m != rhs._m);
|
||||
}
|
||||
months_type operator+(const months_type& rhs)const
|
||||
BOOST_CXX14_CONSTEXPR months_type operator+(const months_type& rhs)const
|
||||
{
|
||||
return months_type(_m + rhs._m);
|
||||
}
|
||||
months_type& operator+=(const months_type& rhs)
|
||||
BOOST_CXX14_CONSTEXPR months_type& operator+=(const months_type& rhs)
|
||||
{
|
||||
_m = _m + rhs._m;
|
||||
return *this;
|
||||
}
|
||||
months_type operator-(const months_type& rhs)const
|
||||
BOOST_CXX14_CONSTEXPR months_type operator-(const months_type& rhs)const
|
||||
{
|
||||
return months_type(_m - rhs._m);
|
||||
}
|
||||
months_type& operator-=(const months_type& rhs)
|
||||
BOOST_CXX14_CONSTEXPR months_type& operator-=(const months_type& rhs)
|
||||
{
|
||||
_m = _m - rhs._m;
|
||||
return *this;
|
||||
}
|
||||
months_type operator*(const int_type rhs)const
|
||||
BOOST_CXX14_CONSTEXPR months_type operator*(const int_type rhs)const
|
||||
{
|
||||
return months_type(_m * rhs);
|
||||
}
|
||||
months_type& operator*=(const int_type rhs)
|
||||
BOOST_CXX14_CONSTEXPR months_type& operator*=(const int_type rhs)
|
||||
{
|
||||
_m = _m * rhs;
|
||||
return *this;
|
||||
}
|
||||
months_type operator/(const int_type rhs)const
|
||||
BOOST_CXX14_CONSTEXPR months_type operator/(const int_type rhs)const
|
||||
{
|
||||
return months_type(_m / rhs);
|
||||
}
|
||||
months_type& operator/=(const int_type rhs)
|
||||
BOOST_CXX14_CONSTEXPR months_type& operator/=(const int_type rhs)
|
||||
{
|
||||
_m = _m / rhs;
|
||||
return *this;
|
||||
}
|
||||
months_type operator+(const years_type& y)const
|
||||
BOOST_CXX14_CONSTEXPR months_type operator+(const years_type& y)const
|
||||
{
|
||||
return months_type(y.number_of_years() * 12 + _m);
|
||||
}
|
||||
months_type& operator+=(const years_type& y)
|
||||
BOOST_CXX14_CONSTEXPR months_type& operator+=(const years_type& y)
|
||||
{
|
||||
_m = y.number_of_years() * 12 + _m;
|
||||
return *this;
|
||||
}
|
||||
months_type operator-(const years_type& y) const
|
||||
BOOST_CXX14_CONSTEXPR months_type operator-(const years_type& y) const
|
||||
{
|
||||
return months_type(_m - y.number_of_years() * 12);
|
||||
}
|
||||
months_type& operator-=(const years_type& y)
|
||||
BOOST_CXX14_CONSTEXPR months_type& operator-=(const years_type& y)
|
||||
{
|
||||
_m = _m - y.number_of_years() * 12;
|
||||
return *this;
|
||||
}
|
||||
|
||||
//
|
||||
friend date_type operator+(const date_type& d, const months_type& m)
|
||||
BOOST_CXX14_CONSTEXPR friend date_type operator+(const date_type& d, const months_type& m)
|
||||
{
|
||||
return d + m.get_offset(d);
|
||||
}
|
||||
friend date_type operator+=(date_type& d, const months_type& m)
|
||||
BOOST_CXX14_CONSTEXPR friend date_type operator+=(date_type& d, const months_type& m)
|
||||
{
|
||||
return d += m.get_offset(d);
|
||||
}
|
||||
friend date_type operator-(const date_type& d, const months_type& m)
|
||||
BOOST_CXX14_CONSTEXPR friend date_type operator-(const date_type& d, const months_type& m)
|
||||
{
|
||||
// get_neg_offset returns a negative duration, so we add
|
||||
return d + m.get_neg_offset(d);
|
||||
}
|
||||
friend date_type operator-=(date_type& d, const months_type& m)
|
||||
BOOST_CXX14_CONSTEXPR friend date_type operator-=(date_type& d, const months_type& m)
|
||||
{
|
||||
// get_neg_offset returns a negative duration, so we add
|
||||
return d += m.get_neg_offset(d);
|
||||
}
|
||||
|
||||
private:
|
||||
int_rep _m;
|
||||
};
|
||||
@@ -159,7 +158,7 @@ namespace date_time {
|
||||
* 2004-Feb-29).
|
||||
*/
|
||||
template<class base_config>
|
||||
class years_duration
|
||||
class BOOST_SYMBOL_VISIBLE years_duration
|
||||
{
|
||||
private:
|
||||
typedef typename base_config::int_rep int_rep;
|
||||
@@ -170,24 +169,24 @@ namespace date_time {
|
||||
typedef years_duration<base_config> years_type;
|
||||
typedef months_duration<base_config> months_type;
|
||||
public:
|
||||
years_duration(int_rep num) : _y(num) {}
|
||||
years_duration(special_values sv) : _y(sv)
|
||||
BOOST_CXX14_CONSTEXPR years_duration(int_rep num) : _y(num) {}
|
||||
BOOST_CXX14_CONSTEXPR years_duration(special_values sv) : _y(sv)
|
||||
{
|
||||
_y = int_rep::from_special(sv);
|
||||
}
|
||||
int_rep number_of_years() const { return _y; }
|
||||
BOOST_CXX14_CONSTEXPR int_rep number_of_years() const { return _y; }
|
||||
//! returns a negative duration
|
||||
duration_type get_neg_offset(const date_type& d) const
|
||||
BOOST_CXX14_CONSTEXPR duration_type get_neg_offset(const date_type& d) const
|
||||
{
|
||||
month_adjustor_type m_adj(_y.as_number() * 12);
|
||||
return duration_type(m_adj.get_neg_offset(d));
|
||||
}
|
||||
duration_type get_offset(const date_type& d) const
|
||||
BOOST_CXX14_CONSTEXPR duration_type get_offset(const date_type& d) const
|
||||
{
|
||||
month_adjustor_type m_adj(_y.as_number() * 12);
|
||||
return duration_type(m_adj.get_offset(d));
|
||||
}
|
||||
bool operator==(const years_type& rhs) const
|
||||
BOOST_CXX14_CONSTEXPR bool operator==(const years_type& rhs) const
|
||||
{
|
||||
return(_y == rhs._y);
|
||||
}
|
||||
@@ -195,75 +194,72 @@ namespace date_time {
|
||||
{
|
||||
return(_y != rhs._y);
|
||||
}
|
||||
years_type operator+(const years_type& rhs)const
|
||||
BOOST_CXX14_CONSTEXPR years_type operator+(const years_type& rhs)const
|
||||
{
|
||||
return years_type(_y + rhs._y);
|
||||
}
|
||||
years_type& operator+=(const years_type& rhs)
|
||||
BOOST_CXX14_CONSTEXPR years_type& operator+=(const years_type& rhs)
|
||||
{
|
||||
_y = _y + rhs._y;
|
||||
return *this;
|
||||
}
|
||||
years_type operator-(const years_type& rhs)const
|
||||
BOOST_CXX14_CONSTEXPR years_type operator-(const years_type& rhs)const
|
||||
{
|
||||
return years_type(_y - rhs._y);
|
||||
}
|
||||
years_type& operator-=(const years_type& rhs)
|
||||
BOOST_CXX14_CONSTEXPR years_type& operator-=(const years_type& rhs)
|
||||
{
|
||||
_y = _y - rhs._y;
|
||||
return *this;
|
||||
}
|
||||
years_type operator*(const int_type rhs)const
|
||||
BOOST_CXX14_CONSTEXPR years_type operator*(const int_type rhs)const
|
||||
{
|
||||
return years_type(_y * rhs);
|
||||
}
|
||||
years_type& operator*=(const int_type rhs)
|
||||
BOOST_CXX14_CONSTEXPR years_type& operator*=(const int_type rhs)
|
||||
{
|
||||
_y = _y * rhs;
|
||||
return *this;
|
||||
}
|
||||
years_type operator/(const int_type rhs)const
|
||||
BOOST_CXX14_CONSTEXPR years_type operator/(const int_type rhs)const
|
||||
{
|
||||
return years_type(_y / rhs);
|
||||
}
|
||||
years_type& operator/=(const int_type rhs)
|
||||
BOOST_CXX14_CONSTEXPR years_type& operator/=(const int_type rhs)
|
||||
{
|
||||
_y = _y / rhs;
|
||||
return *this;
|
||||
}
|
||||
months_type operator+(const months_type& m) const
|
||||
BOOST_CXX14_CONSTEXPR months_type operator+(const months_type& m) const
|
||||
{
|
||||
return(months_type(_y * 12 + m.number_of_months()));
|
||||
}
|
||||
months_type operator-(const months_type& m) const
|
||||
BOOST_CXX14_CONSTEXPR months_type operator-(const months_type& m) const
|
||||
{
|
||||
return(months_type(_y * 12 - m.number_of_months()));
|
||||
}
|
||||
|
||||
//
|
||||
friend date_type operator+(const date_type& d, const years_type& y)
|
||||
BOOST_CXX14_CONSTEXPR friend date_type operator+(const date_type& d, const years_type& y)
|
||||
{
|
||||
return d + y.get_offset(d);
|
||||
}
|
||||
friend date_type operator+=(date_type& d, const years_type& y)
|
||||
BOOST_CXX14_CONSTEXPR friend date_type operator+=(date_type& d, const years_type& y)
|
||||
{
|
||||
return d += y.get_offset(d);
|
||||
}
|
||||
friend date_type operator-(const date_type& d, const years_type& y)
|
||||
BOOST_CXX14_CONSTEXPR friend date_type operator-(const date_type& d, const years_type& y)
|
||||
{
|
||||
// get_neg_offset returns a negative duration, so we add
|
||||
return d + y.get_neg_offset(d);
|
||||
}
|
||||
friend date_type operator-=(date_type& d, const years_type& y)
|
||||
BOOST_CXX14_CONSTEXPR friend date_type operator-=(date_type& d, const years_type& y)
|
||||
{
|
||||
// get_neg_offset returns a negative duration, so we add
|
||||
return d += y.get_neg_offset(d);
|
||||
}
|
||||
|
||||
private:
|
||||
int_rep _y;
|
||||
};
|
||||
|
||||
}} // namespace boost::date_time
|
||||
|
||||
#endif // DATE_DURATION_TYPES_HPP___
|
||||
|
||||
@@ -9,10 +9,10 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include <iterator> // ostreambuf_iterator
|
||||
#include <locale>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <iterator> // ostreambuf_iterator
|
||||
#include <boost/throw_exception.hpp>
|
||||
#include <boost/algorithm/string/replace.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
@@ -46,7 +46,7 @@ namespace boost { namespace date_time {
|
||||
template <class date_type,
|
||||
class CharT,
|
||||
class OutItrT = std::ostreambuf_iterator<CharT, std::char_traits<CharT> > >
|
||||
class date_facet : public std::locale::facet {
|
||||
class BOOST_SYMBOL_VISIBLE date_facet : public std::locale::facet {
|
||||
public:
|
||||
typedef typename date_type::duration_type duration_type;
|
||||
// greg_weekday is gregorian_calendar::day_of_week_type
|
||||
@@ -208,7 +208,8 @@ namespace boost { namespace date_time {
|
||||
// return do_put_special(next, a_ios, fill_char, d.as_special());
|
||||
//}
|
||||
//The following line of code required the date to support a to_tm function
|
||||
std::tm dtm = {};
|
||||
std::tm dtm;
|
||||
std::memset(&dtm, 0, sizeof(dtm));
|
||||
dtm.tm_mon = m - 1;
|
||||
return do_put_tm(next, a_ios, fill_char, dtm, m_month_format);
|
||||
}
|
||||
@@ -219,7 +220,8 @@ namespace boost { namespace date_time {
|
||||
char_type fill_char,
|
||||
const day_type& day) const
|
||||
{
|
||||
std::tm dtm = {};
|
||||
std::tm dtm;
|
||||
std::memset(&dtm, 0, sizeof(dtm));
|
||||
dtm.tm_mday = day.as_number();
|
||||
char_type tmp[3] = {'%','d'};
|
||||
string_type temp_format(tmp);
|
||||
@@ -235,7 +237,8 @@ namespace boost { namespace date_time {
|
||||
// return do_put_special(next, a_ios, fill_char, d.as_special());
|
||||
//}
|
||||
//The following line of code required the date to support a to_tm function
|
||||
std::tm dtm = {};
|
||||
std::tm dtm;
|
||||
std::memset(&dtm, 0, sizeof(dtm));
|
||||
dtm.tm_wday = dow;
|
||||
return do_put_tm(next, a_ios, fill_char, dtm, m_weekday_format);
|
||||
}
|
||||
@@ -313,23 +316,23 @@ namespace boost { namespace date_time {
|
||||
string_type a_format) const
|
||||
{
|
||||
// update format string with custom names
|
||||
if (m_weekday_long_names.size()) {
|
||||
if (!m_weekday_long_names.empty()) {
|
||||
boost::algorithm::replace_all(a_format,
|
||||
long_weekday_format,
|
||||
m_weekday_long_names[tm_value.tm_wday]);
|
||||
}
|
||||
if (m_weekday_short_names.size()) {
|
||||
if (!m_weekday_short_names.empty()) {
|
||||
boost::algorithm::replace_all(a_format,
|
||||
short_weekday_format,
|
||||
m_weekday_short_names[tm_value.tm_wday]);
|
||||
|
||||
}
|
||||
if (m_month_long_names.size()) {
|
||||
if (!m_month_long_names.empty()) {
|
||||
boost::algorithm::replace_all(a_format,
|
||||
long_month_format,
|
||||
m_month_long_names[tm_value.tm_mon]);
|
||||
}
|
||||
if (m_month_short_names.size()) {
|
||||
if (!m_month_short_names.empty()) {
|
||||
boost::algorithm::replace_all(a_format,
|
||||
short_month_format,
|
||||
m_month_short_names[tm_value.tm_mon]);
|
||||
@@ -405,7 +408,7 @@ namespace boost { namespace date_time {
|
||||
template <class date_type,
|
||||
class CharT,
|
||||
class InItrT = std::istreambuf_iterator<CharT, std::char_traits<CharT> > >
|
||||
class date_input_facet : public std::locale::facet {
|
||||
class BOOST_SYMBOL_VISIBLE date_input_facet : public std::locale::facet {
|
||||
public:
|
||||
typedef typename date_type::duration_type duration_type;
|
||||
// greg_weekday is gregorian_calendar::day_of_week_type
|
||||
@@ -760,5 +763,4 @@ namespace boost { namespace date_time {
|
||||
|
||||
} } // namespaces
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
#include "boost/date_time/iso_format.hpp"
|
||||
#include "boost/date_time/compiler_config.hpp"
|
||||
#include <boost/io/ios_state.hpp>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <iomanip>
|
||||
@@ -51,10 +52,13 @@ namespace date_time {
|
||||
}
|
||||
case month_as_integer:
|
||||
{
|
||||
boost::io::basic_ios_fill_saver<charT> ifs(os);
|
||||
os << std::setw(2) << std::setfill(os.widen('0')) << month.as_number();
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
|
||||
}
|
||||
return os;
|
||||
} // format_month
|
||||
@@ -79,7 +83,13 @@ namespace date_time {
|
||||
{
|
||||
typedef typename ymd_type::month_type month_type;
|
||||
std::basic_ostringstream<charT> ss;
|
||||
|
||||
// Temporarily switch to classic locale to prevent possible formatting
|
||||
// of year with comma or other character (for example 2,008).
|
||||
ss.imbue(std::locale::classic());
|
||||
ss << ymd.year;
|
||||
ss.imbue(std::locale());
|
||||
|
||||
if (format_type::has_date_sep_chars()) {
|
||||
ss << format_type::month_sep_char();
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "boost/date_time/iso_format.hpp"
|
||||
#include "boost/date_time/date_names_put.hpp"
|
||||
#include "boost/date_time/parse_format_base.hpp"
|
||||
#include <boost/io/ios_state.hpp>
|
||||
//#include <string>
|
||||
#include <sstream>
|
||||
#include <iomanip>
|
||||
@@ -56,8 +57,8 @@ namespace date_time {
|
||||
}
|
||||
case month_as_integer:
|
||||
{
|
||||
charT fill_char = '0';
|
||||
os << std::setw(2) << std::setfill(fill_char) << month.as_number();
|
||||
boost::io::basic_ios_fill_saver<charT> ifs(os);
|
||||
os << std::setw(2) << std::setfill(os.widen('0')) << month.as_number();
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -132,8 +133,8 @@ namespace date_time {
|
||||
ostream_type& os,
|
||||
const facet_type& f)
|
||||
{
|
||||
boost::io::basic_ios_fill_saver<charT> ifs(os);
|
||||
std::ostreambuf_iterator<charT> oitr(os);
|
||||
charT fill_char = '0';
|
||||
switch (f.date_order()) {
|
||||
case ymd_order_iso: {
|
||||
os << ymd.year;
|
||||
@@ -144,7 +145,7 @@ namespace date_time {
|
||||
if (f.has_date_sep_chars()) {
|
||||
f.day_sep_char(oitr);
|
||||
}
|
||||
os << std::setw(2) << std::setfill(fill_char)
|
||||
os << std::setw(2) << std::setfill(os.widen('0'))
|
||||
<< ymd.day;
|
||||
break;
|
||||
}
|
||||
@@ -153,7 +154,7 @@ namespace date_time {
|
||||
if (f.has_date_sep_chars()) {
|
||||
f.day_sep_char(oitr);
|
||||
}
|
||||
os << std::setw(2) << std::setfill(fill_char)
|
||||
os << std::setw(2) << std::setfill(os.widen('0'))
|
||||
<< ymd.day;
|
||||
if (f.has_date_sep_chars()) {
|
||||
f.month_sep_char(oitr);
|
||||
@@ -162,7 +163,7 @@ namespace date_time {
|
||||
break;
|
||||
}
|
||||
case ymd_order_dmy: {
|
||||
os << std::setw(2) << std::setfill(fill_char)
|
||||
os << std::setw(2) << std::setfill(os.widen('0'))
|
||||
<< ymd.day;
|
||||
if (f.has_date_sep_chars()) {
|
||||
f.day_sep_char(oitr);
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
#define DATE_TIME_DATE_GENERATORS_HPP__
|
||||
|
||||
/* Copyright (c) 2002,2003,2005 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
* Author: Jeff Garland, Bart Garst
|
||||
* Author: Jeff Garland, Bart Garst
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
Definition and implementation of date algorithm templates
|
||||
*/
|
||||
|
||||
#include <stdexcept>
|
||||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
#include <boost/throw_exception.hpp>
|
||||
#include <boost/date_time/date.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
@@ -25,7 +25,7 @@ namespace date_time {
|
||||
//! Base class for all generators that take a year and produce a date.
|
||||
/*! This class is a base class for polymorphic function objects that take
|
||||
a year and produce a concrete date.
|
||||
@param date_type The type representing a date. This type must
|
||||
@tparam date_type The type representing a date. This type must
|
||||
export a calender_type which defines a year_type.
|
||||
*/
|
||||
template<class date_type>
|
||||
@@ -34,16 +34,16 @@ namespace date_time {
|
||||
public:
|
||||
typedef typename date_type::calendar_type calendar_type;
|
||||
typedef typename calendar_type::year_type year_type;
|
||||
year_based_generator() {};
|
||||
virtual ~year_based_generator() {};
|
||||
year_based_generator() {}
|
||||
virtual ~year_based_generator() {}
|
||||
virtual date_type get_date(year_type y) const = 0;
|
||||
//! Returns a string for use in a POSIX time_zone string
|
||||
virtual std::string to_string() const =0;
|
||||
virtual std::string to_string() const = 0;
|
||||
};
|
||||
|
||||
|
||||
//! Generates a date by applying the year to the given month and day.
|
||||
/*!
|
||||
Example usage:
|
||||
Example usage:
|
||||
@code
|
||||
partial_date pd(1, Jan);
|
||||
partial_date pd2(70);
|
||||
@@ -98,7 +98,7 @@ namespace date_time {
|
||||
* pg.get_date(2000); // returns 2000-2-29
|
||||
* @endcode
|
||||
*/
|
||||
date_type get_date(year_type y) const
|
||||
date_type get_date(year_type y) const BOOST_OVERRIDE
|
||||
{
|
||||
if((day_ == 29) && (month_ == 2) && !(calendar_type::is_leap_year(y))) {
|
||||
std::ostringstream ss;
|
||||
@@ -123,9 +123,9 @@ namespace date_time {
|
||||
//months are equal
|
||||
return (day_ < rhs.day_);
|
||||
}
|
||||
|
||||
|
||||
// added for streaming purposes
|
||||
month_type month() const
|
||||
month_type month() const
|
||||
{
|
||||
return month_;
|
||||
}
|
||||
@@ -135,15 +135,15 @@ namespace date_time {
|
||||
}
|
||||
|
||||
//! Returns string suitable for use in POSIX time zone string
|
||||
/*! Returns string formatted with up to 3 digits:
|
||||
* Jan-01 == "0"
|
||||
/*! Returns string formatted with up to 3 digits:
|
||||
* Jan-01 == "0"
|
||||
* Feb-29 == "58"
|
||||
* Dec-31 == "365" */
|
||||
virtual std::string to_string() const
|
||||
std::string to_string() const BOOST_OVERRIDE
|
||||
{
|
||||
std::ostringstream ss;
|
||||
date_type d(2004, month_, day_);
|
||||
unsigned short c = d.day_of_year();
|
||||
unsigned short c = d.day_of_year();
|
||||
c--; // numbered 0-365 while day_of_year is 1 based...
|
||||
ss << c;
|
||||
return ss.str();
|
||||
@@ -153,24 +153,33 @@ namespace date_time {
|
||||
month_type month_;
|
||||
};
|
||||
|
||||
|
||||
//! Returns nth arg as string. 1 -> "first", 2 -> "second", max is 5.
|
||||
BOOST_DATE_TIME_DECL const char* nth_as_str(int n);
|
||||
inline const char* nth_as_str(int ele)
|
||||
{
|
||||
static const char* const _nth_as_str[] = {"out of range", "first", "second",
|
||||
"third", "fourth", "fifth"};
|
||||
if(ele >= 1 && ele <= 5) {
|
||||
return _nth_as_str[ele];
|
||||
}
|
||||
else {
|
||||
return _nth_as_str[0];
|
||||
}
|
||||
}
|
||||
|
||||
//! Useful generator functor for finding holidays
|
||||
/*! Based on the idea in Cal. Calc. for finding holidays that are
|
||||
* the 'first Monday of September'. When instantiated with
|
||||
* 'fifth' kday of month, the result will be the last kday of month
|
||||
* which can be the fourth or fifth depending on the structure of
|
||||
* which can be the fourth or fifth depending on the structure of
|
||||
* the month.
|
||||
*
|
||||
* The algorithm here basically guesses for the first
|
||||
* day of the month. Then finds the first day of the correct
|
||||
* type. That is, if the first of the month is a Tuesday
|
||||
* and it needs Wenesday then we simply increment by a day
|
||||
* and it needs Wednesday then we simply increment by a day
|
||||
* and then we can add the length of a week until we get
|
||||
* to the 'nth kday'. There are probably more efficient
|
||||
* algorithms based on using a mod 7, but this one works
|
||||
* to the 'nth kday'. There are probably more efficient
|
||||
* algorithms based on using a mod 7, but this one works
|
||||
* reasonably well for basic applications.
|
||||
* \ingroup date_alg
|
||||
*/
|
||||
@@ -192,7 +201,7 @@ namespace date_time {
|
||||
dow_(dow)
|
||||
{}
|
||||
//! Return a concrete date when provided with a year specific year.
|
||||
date_type get_date(year_type y) const
|
||||
date_type get_date(year_type y) const BOOST_OVERRIDE
|
||||
{
|
||||
date_type d(y, month_, 1); //first day of month
|
||||
duration_type one_day(1);
|
||||
@@ -230,10 +239,10 @@ namespace date_time {
|
||||
}
|
||||
//! Returns string suitable for use in POSIX time zone string
|
||||
/*! Returns a string formatted as "M4.3.0" ==> 3rd Sunday in April. */
|
||||
virtual std::string to_string() const
|
||||
std::string to_string() const BOOST_OVERRIDE
|
||||
{
|
||||
std::ostringstream ss;
|
||||
ss << 'M'
|
||||
ss << 'M'
|
||||
<< static_cast<int>(month_) << '.'
|
||||
<< static_cast<int>(wn_) << '.'
|
||||
<< static_cast<int>(dow_);
|
||||
@@ -244,7 +253,7 @@ namespace date_time {
|
||||
week_num wn_;
|
||||
day_of_week_type dow_;
|
||||
};
|
||||
|
||||
|
||||
//! Useful generator functor for finding holidays and daylight savings
|
||||
/*! Similar to nth_kday_of_month, but requires less paramters
|
||||
* \ingroup date_alg
|
||||
@@ -267,7 +276,7 @@ namespace date_time {
|
||||
dow_(dow)
|
||||
{}
|
||||
//! Return a concrete date when provided with a year specific year.
|
||||
date_type get_date(year_type year) const
|
||||
date_type get_date(year_type year) const BOOST_OVERRIDE
|
||||
{
|
||||
date_type d(year, month_,1);
|
||||
duration_type one_day(1);
|
||||
@@ -287,10 +296,10 @@ namespace date_time {
|
||||
}
|
||||
//! Returns string suitable for use in POSIX time zone string
|
||||
/*! Returns a string formatted as "M4.1.0" ==> 1st Sunday in April. */
|
||||
virtual std::string to_string() const
|
||||
std::string to_string() const BOOST_OVERRIDE
|
||||
{
|
||||
std::ostringstream ss;
|
||||
ss << 'M'
|
||||
ss << 'M'
|
||||
<< static_cast<int>(month_) << '.'
|
||||
<< 1 << '.'
|
||||
<< static_cast<int>(dow_);
|
||||
@@ -300,14 +309,14 @@ namespace date_time {
|
||||
month_type month_;
|
||||
day_of_week_type dow_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//! Calculate something like Last Sunday of January
|
||||
/*! Useful generator functor for finding holidays and daylight savings
|
||||
* Get the last day of the month and then calculate the difference
|
||||
* to the last previous day.
|
||||
* @param date_type A date class that exports day_of_week, month_type, etc.
|
||||
* @tparam date_type A date class that exports day_of_week, month_type, etc.
|
||||
* \ingroup date_alg
|
||||
*/
|
||||
template<class date_type>
|
||||
@@ -328,7 +337,7 @@ namespace date_time {
|
||||
dow_(dow)
|
||||
{}
|
||||
//! Return a concrete date when provided with a year specific year.
|
||||
date_type get_date(year_type year) const
|
||||
date_type get_date(year_type year) const BOOST_OVERRIDE
|
||||
{
|
||||
date_type d(year, month_, calendar_type::end_of_month_day(year,month_));
|
||||
duration_type one_day(1);
|
||||
@@ -348,10 +357,10 @@ namespace date_time {
|
||||
}
|
||||
//! Returns string suitable for use in POSIX time zone string
|
||||
/*! Returns a string formatted as "M4.5.0" ==> last Sunday in April. */
|
||||
virtual std::string to_string() const
|
||||
std::string to_string() const BOOST_OVERRIDE
|
||||
{
|
||||
std::ostringstream ss;
|
||||
ss << 'M'
|
||||
ss << 'M'
|
||||
<< static_cast<int>(month_) << '.'
|
||||
<< 5 << '.'
|
||||
<< static_cast<int>(dow_);
|
||||
@@ -361,8 +370,8 @@ namespace date_time {
|
||||
month_type month_;
|
||||
day_of_week_type dow_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
//! Calculate something like "First Sunday after Jan 1,2002
|
||||
/*! Date generator that takes a date and finds kday after
|
||||
*@code
|
||||
@@ -400,7 +409,7 @@ namespace date_time {
|
||||
private:
|
||||
day_of_week_type dow_;
|
||||
};
|
||||
|
||||
|
||||
//! Calculate something like "First Sunday before Jan 1,2002
|
||||
/*! Date generator that takes a date and finds kday after
|
||||
*@code
|
||||
@@ -438,10 +447,10 @@ namespace date_time {
|
||||
private:
|
||||
day_of_week_type dow_;
|
||||
};
|
||||
|
||||
|
||||
//! Calculates the number of days until the next weekday
|
||||
/*! Calculates the number of days until the next weekday.
|
||||
* If the date given falls on a Sunday and the given weekday
|
||||
* If the date given falls on a Sunday and the given weekday
|
||||
* is Tuesday the result will be 2 days */
|
||||
template<typename date_type, class weekday_type>
|
||||
inline
|
||||
@@ -458,8 +467,8 @@ namespace date_time {
|
||||
|
||||
//! Calculates the number of days since the previous weekday
|
||||
/*! Calculates the number of days since the previous weekday
|
||||
* If the date given falls on a Sunday and the given weekday
|
||||
* is Tuesday the result will be 5 days. The answer will be a positive
|
||||
* If the date given falls on a Sunday and the given weekday
|
||||
* is Tuesday the result will be 5 days. The answer will be a positive
|
||||
* number because Tuesday is 5 days before Sunday, not -5 days before. */
|
||||
template<typename date_type, class weekday_type>
|
||||
inline
|
||||
@@ -477,9 +486,9 @@ namespace date_time {
|
||||
}
|
||||
|
||||
//! Generates a date object representing the date of the following weekday from the given date
|
||||
/*! Generates a date object representing the date of the following
|
||||
* weekday from the given date. If the date given is 2004-May-9
|
||||
* (a Sunday) and the given weekday is Tuesday then the resulting date
|
||||
/*! Generates a date object representing the date of the following
|
||||
* weekday from the given date. If the date given is 2004-May-9
|
||||
* (a Sunday) and the given weekday is Tuesday then the resulting date
|
||||
* will be 2004-May-11. */
|
||||
template<class date_type, class weekday_type>
|
||||
inline
|
||||
@@ -489,9 +498,9 @@ namespace date_time {
|
||||
}
|
||||
|
||||
//! Generates a date object representing the date of the previous weekday from the given date
|
||||
/*! Generates a date object representing the date of the previous
|
||||
* weekday from the given date. If the date given is 2004-May-9
|
||||
* (a Sunday) and the given weekday is Tuesday then the resulting date
|
||||
/*! Generates a date object representing the date of the previous
|
||||
* weekday from the given date. If the date given is 2004-May-9
|
||||
* (a Sunday) and the given weekday is Tuesday then the resulting date
|
||||
* will be 2004-May-4. */
|
||||
template<class date_type, class weekday_type>
|
||||
inline
|
||||
@@ -502,8 +511,4 @@ namespace date_time {
|
||||
|
||||
} } //namespace date_time
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define DATE_ITERATOR_HPP___
|
||||
|
||||
/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
* Author: Jeff Garland, Bart Garst
|
||||
@@ -32,7 +32,7 @@ namespace date_time {
|
||||
template<class date_type>
|
||||
class date_itr_base {
|
||||
// works, but benefit unclear at the moment
|
||||
// class date_itr_base : public std::iterator<std::input_iterator_tag,
|
||||
// class date_itr_base : public std::iterator<std::input_iterator_tag,
|
||||
// date_type, void, void, void>{
|
||||
public:
|
||||
typedef typename date_type::duration_type duration_type;
|
||||
@@ -40,31 +40,31 @@ namespace date_time {
|
||||
typedef std::input_iterator_tag iterator_category;
|
||||
|
||||
date_itr_base(date_type d) : current_(d) {}
|
||||
virtual ~date_itr_base() {};
|
||||
date_itr_base& operator++()
|
||||
virtual ~date_itr_base() {}
|
||||
date_itr_base& operator++()
|
||||
{
|
||||
current_ = current_ + get_offset(current_);
|
||||
return *this;
|
||||
}
|
||||
date_itr_base& operator--()
|
||||
date_itr_base& operator--()
|
||||
{
|
||||
current_ = current_ + get_neg_offset(current_);
|
||||
return *this;
|
||||
}
|
||||
virtual duration_type get_offset(const date_type& current) const=0;
|
||||
virtual duration_type get_neg_offset(const date_type& current) const=0;
|
||||
date_type operator*() {return current_;};
|
||||
date_type* operator->() {return ¤t_;};
|
||||
bool operator< (const date_type& d) {return current_ < d;}
|
||||
bool operator<= (const date_type& d) {return current_ <= d;}
|
||||
bool operator> (const date_type& d) {return current_ > d;}
|
||||
bool operator>= (const date_type& d) {return current_ >= d;}
|
||||
bool operator== (const date_type& d) {return current_ == d;}
|
||||
bool operator!= (const date_type& d) {return current_ != d;}
|
||||
const date_type& operator*() const {return current_;}
|
||||
const date_type* operator->() const {return ¤t_;}
|
||||
bool operator< (const date_type& d) const {return current_ < d;}
|
||||
bool operator<= (const date_type& d) const {return current_ <= d;}
|
||||
bool operator> (const date_type& d) const {return current_ > d;}
|
||||
bool operator>= (const date_type& d) const {return current_ >= d;}
|
||||
bool operator== (const date_type& d) const {return current_ == d;}
|
||||
bool operator!= (const date_type& d) const {return current_ != d;}
|
||||
private:
|
||||
date_type current_;
|
||||
};
|
||||
|
||||
|
||||
//! Overrides the base date iterator providing hook for functors
|
||||
/*
|
||||
* <b>offset_functor</b>
|
||||
@@ -77,9 +77,9 @@ namespace date_time {
|
||||
class date_itr : public date_itr_base<date_type> {
|
||||
public:
|
||||
typedef typename date_type::duration_type duration_type;
|
||||
date_itr(date_type d, int factor=1) :
|
||||
date_itr_base<date_type>(d),
|
||||
of_(factor)
|
||||
date_itr(date_type d, int factor=1) :
|
||||
date_itr_base<date_type>(d),
|
||||
of_(factor)
|
||||
{}
|
||||
private:
|
||||
virtual duration_type get_offset(const date_type& current) const
|
||||
@@ -92,9 +92,9 @@ namespace date_time {
|
||||
}
|
||||
offset_functor of_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
} } //namespace date_time
|
||||
|
||||
|
||||
|
||||
@@ -2,22 +2,23 @@
|
||||
#define DATE_TIME_DATE_NAMES_PUT_HPP___
|
||||
|
||||
/* Copyright (c) 2002-2005 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
* Author: Jeff Garland, Bart Garst
|
||||
* Author: Jeff Garland, Bart Garst
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
|
||||
#include "boost/date_time/locale_config.hpp" // set BOOST_DATE_TIME_NO_LOCALE
|
||||
#include <boost/date_time/locale_config.hpp> // set BOOST_DATE_TIME_NO_LOCALE
|
||||
|
||||
#ifndef BOOST_DATE_TIME_NO_LOCALE
|
||||
|
||||
#include "boost/date_time/special_defs.hpp"
|
||||
#include "boost/date_time/date_defs.hpp"
|
||||
#include "boost/date_time/parse_format_base.hpp"
|
||||
#include "boost/lexical_cast.hpp"
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/special_defs.hpp>
|
||||
#include <boost/date_time/date_defs.hpp>
|
||||
#include <boost/date_time/parse_format_base.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <locale>
|
||||
|
||||
|
||||
@@ -27,22 +28,22 @@ namespace date_time {
|
||||
//! Output facet base class for gregorian dates.
|
||||
/*! This class is a base class for date facets used to localize the
|
||||
* names of months and the names of days in the week.
|
||||
*
|
||||
*
|
||||
* Requirements of Config
|
||||
* - define an enumeration month_enum that enumerates the months.
|
||||
* - define an enumeration month_enum that enumerates the months.
|
||||
* The enumeration should be '1' based eg: Jan==1
|
||||
* - define as_short_string and as_long_string
|
||||
*
|
||||
* (see langer & kreft p334).
|
||||
*
|
||||
*
|
||||
*/
|
||||
template<class Config,
|
||||
class charT = char,
|
||||
class charT = char,
|
||||
class OutputIterator = std::ostreambuf_iterator<charT> >
|
||||
class date_names_put : public std::locale::facet
|
||||
class BOOST_SYMBOL_VISIBLE date_names_put : public std::locale::facet
|
||||
{
|
||||
public:
|
||||
date_names_put() {};
|
||||
date_names_put() {}
|
||||
typedef OutputIterator iter_type;
|
||||
typedef typename Config::month_type month_type;
|
||||
typedef typename Config::month_enum month_enum;
|
||||
@@ -118,7 +119,7 @@ namespace date_time {
|
||||
put_string(oitr, gm.as_short_string(c));
|
||||
}
|
||||
//! Default facet implementation uses month_type defaults
|
||||
virtual void do_put_month_long(iter_type& oitr,
|
||||
virtual void do_put_month_long(iter_type& oitr,
|
||||
month_enum moy) const
|
||||
{
|
||||
month_type gm(moy);
|
||||
@@ -160,7 +161,7 @@ namespace date_time {
|
||||
string_type s(separator); //put in '-'
|
||||
put_string(oitr, s);
|
||||
}
|
||||
//! Default for date order
|
||||
//! Default for date order
|
||||
virtual ymd_order_spec do_date_order() const
|
||||
{
|
||||
return ymd_order_iso;
|
||||
@@ -186,29 +187,29 @@ namespace date_time {
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template<class Config, class charT, class OutputIterator>
|
||||
const typename date_names_put<Config, charT, OutputIterator>::char_type
|
||||
date_names_put<Config, charT, OutputIterator>::default_special_value_names[3][17] = {
|
||||
const typename date_names_put<Config, charT, OutputIterator>::char_type
|
||||
date_names_put<Config, charT, OutputIterator>::default_special_value_names[3][17] = {
|
||||
{'n','o','t','-','a','-','d','a','t','e','-','t','i','m','e'},
|
||||
{'-','i','n','f','i','n','i','t','y'},
|
||||
{'+','i','n','f','i','n','i','t','y'} };
|
||||
|
||||
template<class Config, class charT, class OutputIterator>
|
||||
const typename date_names_put<Config, charT, OutputIterator>::char_type
|
||||
date_names_put<Config, charT, OutputIterator>::separator[2] =
|
||||
const typename date_names_put<Config, charT, OutputIterator>::char_type
|
||||
date_names_put<Config, charT, OutputIterator>::separator[2] =
|
||||
{'-', '\0'} ;
|
||||
|
||||
|
||||
//! Generate storage location for a std::locale::id
|
||||
|
||||
//! Generate storage location for a std::locale::id
|
||||
template<class Config, class charT, class OutputIterator>
|
||||
std::locale::id date_names_put<Config, charT, OutputIterator>::id;
|
||||
|
||||
//! A date name output facet that takes an array of char* to define strings
|
||||
template<class Config,
|
||||
class charT = char,
|
||||
class charT = char,
|
||||
class OutputIterator = std::ostreambuf_iterator<charT> >
|
||||
class all_date_names_put : public date_names_put<Config, charT, OutputIterator>
|
||||
class BOOST_SYMBOL_VISIBLE all_date_names_put : public date_names_put<Config, charT, OutputIterator>
|
||||
{
|
||||
public:
|
||||
all_date_names_put(const charT* const month_short_names[],
|
||||
@@ -230,29 +231,29 @@ namespace date_time {
|
||||
separator_char_[0] = separator_char;
|
||||
separator_char_[1] = '\0';
|
||||
|
||||
};
|
||||
}
|
||||
typedef OutputIterator iter_type;
|
||||
typedef typename Config::month_enum month_enum;
|
||||
typedef typename Config::weekday_enum weekday_enum;
|
||||
typedef typename Config::special_value_enum special_value_enum;
|
||||
|
||||
const charT* const* get_short_month_names() const
|
||||
const charT* const* get_short_month_names() const
|
||||
{
|
||||
return month_short_names_;
|
||||
}
|
||||
const charT* const* get_long_month_names() const
|
||||
const charT* const* get_long_month_names() const
|
||||
{
|
||||
return month_long_names_;
|
||||
}
|
||||
const charT* const* get_special_value_names() const
|
||||
const charT* const* get_special_value_names() const
|
||||
{
|
||||
return special_value_names_;
|
||||
}
|
||||
const charT* const* get_short_weekday_names()const
|
||||
const charT* const* get_short_weekday_names()const
|
||||
{
|
||||
return weekday_short_names_;
|
||||
}
|
||||
const charT* const* get_long_weekday_names()const
|
||||
const charT* const* get_long_weekday_names()const
|
||||
{
|
||||
return weekday_long_names_;
|
||||
}
|
||||
@@ -263,7 +264,7 @@ namespace date_time {
|
||||
{
|
||||
this->put_string(oitr, month_short_names_[moy-1]);
|
||||
}
|
||||
//! Long month names
|
||||
//! Long month names
|
||||
virtual void do_put_month_long(iter_type& oitr, month_enum moy) const
|
||||
{
|
||||
this->put_string(oitr, month_long_names_[moy-1]);
|
||||
@@ -310,7 +311,7 @@ namespace date_time {
|
||||
const charT* const* weekday_long_names_;
|
||||
charT separator_char_[2];
|
||||
ymd_order_spec order_spec_;
|
||||
month_format_spec month_format_spec_;
|
||||
month_format_spec month_format_spec_;
|
||||
};
|
||||
|
||||
} } //namespace boost::date_time
|
||||
|
||||
@@ -9,13 +9,16 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <iterator>
|
||||
#include <algorithm>
|
||||
#include <boost/tokenizer.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/parse_format_base.hpp>
|
||||
#include <boost/date_time/period.hpp>
|
||||
|
||||
#if defined(BOOST_DATE_TIME_NO_LOCALE)
|
||||
#include <cctype> // ::tolower(int)
|
||||
@@ -54,8 +57,6 @@ namespace date_time {
|
||||
}
|
||||
|
||||
//! Helper function for parse_date.
|
||||
/* Used by-value parameter because we change the string and may
|
||||
* want to preserve the original argument */
|
||||
template<class month_type>
|
||||
inline unsigned short
|
||||
month_str_to_ushort(std::string const& s) {
|
||||
@@ -64,34 +65,59 @@ namespace date_time {
|
||||
}
|
||||
else {
|
||||
std::string str = convert_to_lower(s);
|
||||
typename month_type::month_map_ptr_type ptr = month_type::get_month_map_ptr();
|
||||
typename month_type::month_map_type::iterator iter = ptr->find(str);
|
||||
if(iter != ptr->end()) { // required for STLport
|
||||
return iter->second;
|
||||
//c++98 support
|
||||
#if defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
|
||||
static std::map<std::string, unsigned short> month_map;
|
||||
typedef std::map<std::string, unsigned short>::value_type vtype;
|
||||
if( month_map.empty() ) {
|
||||
month_map.insert( vtype("jan", static_cast<unsigned short>(1)) );
|
||||
month_map.insert( vtype("january", static_cast<unsigned short>(1)) );
|
||||
month_map.insert( vtype("feb", static_cast<unsigned short>(2)) );
|
||||
month_map.insert( vtype("february", static_cast<unsigned short>(2)) );
|
||||
month_map.insert( vtype("mar", static_cast<unsigned short>(3)) );
|
||||
month_map.insert( vtype("march", static_cast<unsigned short>(3)) );
|
||||
month_map.insert( vtype("apr", static_cast<unsigned short>(4)) );
|
||||
month_map.insert( vtype("april", static_cast<unsigned short>(4)) );
|
||||
month_map.insert( vtype("may", static_cast<unsigned short>(5)) );
|
||||
month_map.insert( vtype("jun", static_cast<unsigned short>(6)) );
|
||||
month_map.insert( vtype("june", static_cast<unsigned short>(6)) );
|
||||
month_map.insert( vtype("jul", static_cast<unsigned short>(7)) );
|
||||
month_map.insert( vtype("july", static_cast<unsigned short>(7)) );
|
||||
month_map.insert( vtype("aug", static_cast<unsigned short>(8)) );
|
||||
month_map.insert( vtype("august", static_cast<unsigned short>(8)) );
|
||||
month_map.insert( vtype("sep", static_cast<unsigned short>(9)) );
|
||||
month_map.insert( vtype("september", static_cast<unsigned short>(9)) );
|
||||
month_map.insert( vtype("oct", static_cast<unsigned short>(10)) );
|
||||
month_map.insert( vtype("october", static_cast<unsigned short>(10)) );
|
||||
month_map.insert( vtype("nov", static_cast<unsigned short>(11)) );
|
||||
month_map.insert( vtype("november", static_cast<unsigned short>(11)) );
|
||||
month_map.insert( vtype("dec", static_cast<unsigned short>(12)) );
|
||||
month_map.insert( vtype("december", static_cast<unsigned short>(12)) );
|
||||
}
|
||||
#else //c+11 and beyond
|
||||
static std::map<std::string, unsigned short> month_map =
|
||||
{ { "jan", static_cast<unsigned short>(1) }, { "january", static_cast<unsigned short>(1) },
|
||||
{ "feb", static_cast<unsigned short>(2) }, { "february", static_cast<unsigned short>(2) },
|
||||
{ "mar", static_cast<unsigned short>(3) }, { "march", static_cast<unsigned short>(3) },
|
||||
{ "apr", static_cast<unsigned short>(4) }, { "april", static_cast<unsigned short>(4) },
|
||||
{ "may", static_cast<unsigned short>(5) },
|
||||
{ "jun", static_cast<unsigned short>(6) }, { "june", static_cast<unsigned short>(6) },
|
||||
{ "jul", static_cast<unsigned short>(7) }, { "july", static_cast<unsigned short>(7) },
|
||||
{ "aug", static_cast<unsigned short>(8) }, { "august", static_cast<unsigned short>(8) },
|
||||
{ "sep", static_cast<unsigned short>(9) }, { "september", static_cast<unsigned short>(9) },
|
||||
{ "oct", static_cast<unsigned short>(10) }, { "october", static_cast<unsigned short>(10)},
|
||||
{ "nov", static_cast<unsigned short>(11) }, { "november", static_cast<unsigned short>(11)},
|
||||
{ "dec", static_cast<unsigned short>(12) }, { "december", static_cast<unsigned short>(12)}
|
||||
};
|
||||
#endif
|
||||
std::map<std::string, unsigned short>::const_iterator mitr = month_map.find( str );
|
||||
if ( mitr != month_map.end() ) {
|
||||
return mitr->second;
|
||||
}
|
||||
}
|
||||
return 13; // intentionally out of range - name not found
|
||||
}
|
||||
|
||||
//! Find index of a string in either of 2 arrays
|
||||
/*! find_match searches both arrays for a match to 's'. Both arrays
|
||||
* must contain 'size' elements. The index of the match is returned.
|
||||
* If no match is found, 'size' is returned.
|
||||
* Ex. "Jan" returns 0, "Dec" returns 11, "Tue" returns 2.
|
||||
* 'size' can be sent in with: (greg_month::max)() (which 12),
|
||||
* (greg_weekday::max)() + 1 (which is 7) or date_time::NumSpecialValues */
|
||||
template<class charT>
|
||||
short find_match(const charT* const* short_names,
|
||||
const charT* const* long_names,
|
||||
short size,
|
||||
const std::basic_string<charT>& s) {
|
||||
for(short i = 0; i < size; ++i){
|
||||
if(short_names[i] == s || long_names[i] == s){
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return size; // not-found, return a value out of range
|
||||
}
|
||||
|
||||
//! Generic function to parse a delimited date (eg: 2002-02-10)
|
||||
/*! Accepted formats are: "2003-02-10" or " 2003-Feb-10" or
|
||||
@@ -113,7 +139,6 @@ namespace date_time {
|
||||
spec_str = "mdy";
|
||||
}
|
||||
|
||||
typedef typename date_type::year_type year_type;
|
||||
typedef typename date_type::month_type month_type;
|
||||
unsigned pos = 0;
|
||||
unsigned short year(0), month(0), day(0);
|
||||
@@ -148,6 +173,7 @@ namespace date_time {
|
||||
day = boost::lexical_cast<unsigned short>(*beg);
|
||||
break;
|
||||
}
|
||||
default: break;
|
||||
} //switch
|
||||
}
|
||||
return date_type(year, month, day);
|
||||
@@ -159,7 +185,6 @@ namespace date_time {
|
||||
parse_undelimited_date(const std::string& s) {
|
||||
int offsets[] = {4,2,2};
|
||||
int pos = 0;
|
||||
typedef typename date_type::year_type year_type;
|
||||
//typename date_type::ymd_type ymd((year_type::min)(),1,1);
|
||||
unsigned short y = 0, m = 0, d = 0;
|
||||
|
||||
@@ -180,6 +205,7 @@ namespace date_time {
|
||||
case 0: y = i; break;
|
||||
case 1: m = i; break;
|
||||
case 2: d = i; break;
|
||||
default: break;
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define DATE_TIME_DST_RULES_HPP__
|
||||
|
||||
/* Copyright (c) 2002,2003, 2007 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
* Author: Jeff Garland, Bart Garst
|
||||
@@ -21,12 +21,12 @@
|
||||
namespace boost {
|
||||
namespace date_time {
|
||||
|
||||
enum time_is_dst_result {is_not_in_dst, is_in_dst,
|
||||
enum time_is_dst_result {is_not_in_dst, is_in_dst,
|
||||
ambiguous, invalid_time_label};
|
||||
|
||||
|
||||
//! Dynamic class used to caluclate dst transition information
|
||||
template<class date_type_,
|
||||
template<class date_type_,
|
||||
class time_duration_type_>
|
||||
class dst_calculator
|
||||
{
|
||||
@@ -37,14 +37,14 @@ namespace boost {
|
||||
//! Check the local time offset when on dst start day
|
||||
/*! On this dst transition, the time label between
|
||||
* the transition boundary and the boudary + the offset
|
||||
* are invalid times. If before the boundary then still
|
||||
* not in dst.
|
||||
* are invalid times. If before the boundary then still
|
||||
* not in dst.
|
||||
*@param time_of_day Time offset in the day for the local time
|
||||
*@param dst_start_offset_minutes Local day offset for start of dst
|
||||
*@param dst_length_minutes Number of minutes to adjust clock forward
|
||||
*@retval status of time label w.r.t. dst
|
||||
*/
|
||||
static time_is_dst_result
|
||||
static time_is_dst_result
|
||||
process_local_dst_start_day(const time_duration_type& time_of_day,
|
||||
unsigned int dst_start_offset_minutes,
|
||||
long dst_length_minutes)
|
||||
@@ -57,19 +57,19 @@ namespace boost {
|
||||
if (time_of_day >= time_duration_type(0,offset,0)) {
|
||||
return is_in_dst;
|
||||
}
|
||||
return invalid_time_label;
|
||||
return invalid_time_label;
|
||||
}
|
||||
|
||||
//! Check the local time offset when on the last day of dst
|
||||
/*! This is the calculation for the DST end day. On that day times
|
||||
* prior to the conversion time - dst_length (1 am in US) are still
|
||||
* in dst. Times between the above and the switch time are
|
||||
* prior to the conversion time - dst_length (1 am in US) are still
|
||||
* in dst. Times between the above and the switch time are
|
||||
* ambiguous. Times after the start_offset are not in dst.
|
||||
*@param time_of_day Time offset in the day for the local time
|
||||
*@param dst_end_offset_minutes Local time of day for end of dst
|
||||
*@retval status of time label w.r.t. dst
|
||||
*/
|
||||
static time_is_dst_result
|
||||
static time_is_dst_result
|
||||
process_local_dst_end_day(const time_duration_type& time_of_day,
|
||||
unsigned int dst_end_offset_minutes,
|
||||
long dst_length_minutes)
|
||||
@@ -86,32 +86,32 @@ namespace boost {
|
||||
}
|
||||
|
||||
//! Calculates if the given local time is dst or not
|
||||
/*! Determines if the time is really in DST or not. Also checks for
|
||||
/*! Determines if the time is really in DST or not. Also checks for
|
||||
* invalid and ambiguous.
|
||||
* @param current_day The day to check for dst
|
||||
* @param time_of_day Time offset within the day to check
|
||||
* @param time_of_day Time offset within the day to check
|
||||
* @param dst_start_day Starting day of dst for the given locality
|
||||
* @param dst_start_offset Time offset within day for dst boundary
|
||||
* @param dst_end_day Ending day of dst for the given locality
|
||||
* @param dst_end_offset Time offset within day given in dst for dst boundary
|
||||
* @param dst_length lenght of dst adjusment
|
||||
* @param dst_length_minutes length of dst adjusment
|
||||
* @retval The time is either ambiguous, invalid, in dst, or not in dst
|
||||
*/
|
||||
static time_is_dst_result
|
||||
static time_is_dst_result
|
||||
local_is_dst(const date_type& current_day,
|
||||
const time_duration_type& time_of_day,
|
||||
const date_type& dst_start_day,
|
||||
const time_duration_type& dst_start_offset,
|
||||
const date_type& dst_end_day,
|
||||
const time_duration_type& dst_end_offset,
|
||||
const time_duration_type& dst_length_minutes)
|
||||
const time_duration_type& dst_length)
|
||||
{
|
||||
unsigned int start_minutes =
|
||||
dst_start_offset.hours() * 60 + dst_start_offset.minutes();
|
||||
unsigned int end_minutes =
|
||||
dst_end_offset.hours() * 60 + dst_end_offset.minutes();
|
||||
long length_minutes =
|
||||
dst_length_minutes.hours() * 60 + dst_length_minutes.minutes();
|
||||
unsigned int start_minutes = static_cast<unsigned>(
|
||||
dst_start_offset.hours() * 60 + dst_start_offset.minutes());
|
||||
unsigned int end_minutes = static_cast<unsigned>(
|
||||
dst_end_offset.hours() * 60 + dst_end_offset.minutes());
|
||||
long length_minutes = static_cast<long>(
|
||||
dst_length.hours() * 60 + dst_length.minutes());
|
||||
|
||||
return local_is_dst(current_day, time_of_day,
|
||||
dst_start_day, start_minutes,
|
||||
@@ -120,20 +120,20 @@ namespace boost {
|
||||
}
|
||||
|
||||
//! Calculates if the given local time is dst or not
|
||||
/*! Determines if the time is really in DST or not. Also checks for
|
||||
/*! Determines if the time is really in DST or not. Also checks for
|
||||
* invalid and ambiguous.
|
||||
* @param current_day The day to check for dst
|
||||
* @param time_of_day Time offset within the day to check
|
||||
* @param time_of_day Time offset within the day to check
|
||||
* @param dst_start_day Starting day of dst for the given locality
|
||||
* @param dst_start_offset_minutes Offset within day for dst
|
||||
* @param dst_start_offset_minutes Offset within day for dst
|
||||
* boundary (eg 120 for US which is 02:00:00)
|
||||
* @param dst_end_day Ending day of dst for the given locality
|
||||
* @param dst_end_offset_minutes Offset within day given in dst for dst
|
||||
* @param dst_end_offset_minutes Offset within day given in dst for dst
|
||||
* boundary (eg 120 for US which is 02:00:00)
|
||||
* @param dst_length_minutes Length of dst adjusment (eg: 60 for US)
|
||||
* @retval The time is either ambiguous, invalid, in dst, or not in dst
|
||||
*/
|
||||
static time_is_dst_result
|
||||
static time_is_dst_result
|
||||
local_is_dst(const date_type& current_day,
|
||||
const time_duration_type& time_of_day,
|
||||
const date_type& dst_start_day,
|
||||
@@ -165,7 +165,7 @@ namespace boost {
|
||||
dst_start_offset_minutes,
|
||||
dst_length_minutes);
|
||||
}
|
||||
|
||||
|
||||
if (current_day == dst_end_day) {
|
||||
return process_local_dst_end_day(time_of_day,
|
||||
dst_end_offset_minutes,
|
||||
@@ -183,29 +183,29 @@ namespace boost {
|
||||
* calculation at compile time covering all the cases. Unfortunately
|
||||
* because of the number of dimensions related to daylight savings
|
||||
* calculation the number of parameters is high. In addition, the
|
||||
* start and end transition rules are complex types that specify
|
||||
* start and end transition rules are complex types that specify
|
||||
* an algorithm for calculation of the starting day and ending
|
||||
* day of daylight savings time including the month and day
|
||||
* day of daylight savings time including the month and day
|
||||
* specifications (eg: last sunday in October).
|
||||
*
|
||||
* @param date_type A type that represents dates, typically gregorian::date
|
||||
* @param time_duration_type Used for the offset in the day calculations
|
||||
* @param dst_traits A set of traits that define the rules of dst
|
||||
* @param dst_traits A set of traits that define the rules of dst
|
||||
* calculation. The dst_trait must include the following:
|
||||
* start_rule_functor - Rule to calculate the starting date of a
|
||||
* dst transition (eg: last_kday_of_month).
|
||||
* start_day - static function that returns month of dst start for
|
||||
* start_day - static function that returns month of dst start for
|
||||
* start_rule_functor
|
||||
* start_month -static function that returns day or day of week for
|
||||
* start_month -static function that returns day or day of week for
|
||||
* dst start of dst
|
||||
* end_rule_functor - Rule to calculate the end of dst day.
|
||||
* end_day - static fucntion that returns end day for end_rule_functor
|
||||
* end_month - static function that returns end month for end_rule_functor
|
||||
* dst_start_offset_minutes - number of minutes from start of day to transition to dst -- 120 (or 2:00 am) is typical for the U.S. and E.U.
|
||||
* dst_start_offset_minutes - number of minutes from start of day to transition off of dst -- 180 (or 3:00 am) is typical for E.U.
|
||||
* dst_start_offset_minutes - number of minutes from start of day to transition off of dst -- 180 (or 3:00 am) is typical for E.U.
|
||||
* dst_length_minutes - number of minutes that dst shifts clock
|
||||
*/
|
||||
template<class date_type,
|
||||
template<class date_type,
|
||||
class time_duration_type,
|
||||
class dst_traits>
|
||||
class dst_calc_engine
|
||||
@@ -216,12 +216,12 @@ namespace boost {
|
||||
typedef dst_calculator<date_type, time_duration_type> dstcalc;
|
||||
|
||||
//! Calculates if the given local time is dst or not
|
||||
/*! Determines if the time is really in DST or not. Also checks for
|
||||
/*! Determines if the time is really in DST or not. Also checks for
|
||||
* invalid and ambiguous.
|
||||
* @retval The time is either ambiguous, invalid, in dst, or not in dst
|
||||
*/
|
||||
static time_is_dst_result local_is_dst(const date_type& d,
|
||||
const time_duration_type& td)
|
||||
const time_duration_type& td)
|
||||
{
|
||||
|
||||
year_type y = d.year();
|
||||
@@ -230,10 +230,10 @@ namespace boost {
|
||||
return dstcalc::local_is_dst(d,td,
|
||||
dst_start,
|
||||
dst_traits::dst_start_offset_minutes(),
|
||||
dst_end,
|
||||
dst_traits::dst_end_offset_minutes(),
|
||||
dst_end,
|
||||
dst_traits::dst_end_offset_minutes(),
|
||||
dst_traits::dst_shift_length_minutes());
|
||||
|
||||
|
||||
}
|
||||
|
||||
static bool is_dst_boundary_day(date_type d)
|
||||
@@ -244,14 +244,14 @@ namespace boost {
|
||||
}
|
||||
|
||||
//! The time of day for the dst transition (eg: typically 01:00:00 or 02:00:00)
|
||||
static time_duration_type dst_offset()
|
||||
static time_duration_type dst_offset()
|
||||
{
|
||||
return time_duration_type(0,dst_traits::dst_shift_length_minutes(),0);
|
||||
}
|
||||
|
||||
static date_type local_dst_start_day(year_type year)
|
||||
{
|
||||
return dst_traits::local_dst_start_day(year);
|
||||
return dst_traits::local_dst_start_day(year);
|
||||
}
|
||||
|
||||
static date_type local_dst_end_day(year_type year)
|
||||
@@ -267,11 +267,11 @@ namespace boost {
|
||||
* In 2007 US/Canada DST rules changed
|
||||
* (http://en.wikipedia.org/wiki/Energy_Policy_Act_of_2005#Change_to_daylight_saving_time).
|
||||
*/
|
||||
template<class date_type_,
|
||||
template<class date_type_,
|
||||
class time_duration_type_,
|
||||
unsigned int dst_start_offset_minutes=120, //from start of day
|
||||
unsigned int dst_start_offset_minutes=120, //from start of day
|
||||
short dst_length_minutes=60> //1 hour == 60 min in US
|
||||
class us_dst_rules
|
||||
class us_dst_rules
|
||||
{
|
||||
public:
|
||||
typedef time_duration_type_ time_duration_type;
|
||||
@@ -284,12 +284,12 @@ namespace boost {
|
||||
typedef dst_calculator<date_type, time_duration_type> dstcalc;
|
||||
|
||||
//! Calculates if the given local time is dst or not
|
||||
/*! Determines if the time is really in DST or not. Also checks for
|
||||
/*! Determines if the time is really in DST or not. Also checks for
|
||||
* invalid and ambiguous.
|
||||
* @retval The time is either ambiguous, invalid, in dst, or not in dst
|
||||
*/
|
||||
static time_is_dst_result local_is_dst(const date_type& d,
|
||||
const time_duration_type& td)
|
||||
const time_duration_type& td)
|
||||
{
|
||||
|
||||
year_type y = d.year();
|
||||
@@ -297,9 +297,9 @@ namespace boost {
|
||||
date_type dst_end = local_dst_end_day(y);
|
||||
return dstcalc::local_is_dst(d,td,
|
||||
dst_start,dst_start_offset_minutes,
|
||||
dst_end, dst_start_offset_minutes,
|
||||
dst_end, dst_start_offset_minutes,
|
||||
dst_length_minutes);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -314,12 +314,12 @@ namespace boost {
|
||||
{
|
||||
if (year >= year_type(2007)) {
|
||||
//second sunday in march
|
||||
nkday ssim(nkday::second, Sunday, gregorian::Mar);
|
||||
return ssim.get_date(year);
|
||||
nkday ssim(nkday::second, Sunday, date_time::Mar);
|
||||
return ssim.get_date(year);
|
||||
} else {
|
||||
//first sunday in april
|
||||
fkday fsia(Sunday, gregorian::Apr);
|
||||
return fsia.get_date(year);
|
||||
fkday fsia(Sunday, date_time::Apr);
|
||||
return fsia.get_date(year);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -327,11 +327,11 @@ namespace boost {
|
||||
{
|
||||
if (year >= year_type(2007)) {
|
||||
//first sunday in november
|
||||
fkday fsin(Sunday, gregorian::Nov);
|
||||
return fsin.get_date(year);
|
||||
fkday fsin(Sunday, date_time::Nov);
|
||||
return fsin.get_date(year);
|
||||
} else {
|
||||
//last sunday in october
|
||||
lkday lsio(Sunday, gregorian::Oct);
|
||||
lkday lsio(Sunday, date_time::Oct);
|
||||
return lsio.get_date(year);
|
||||
}
|
||||
}
|
||||
@@ -358,25 +358,25 @@ namespace boost {
|
||||
//! Calculates if the given local time is dst or not
|
||||
/*! @retval Always is_not_in_dst since this is for zones without dst
|
||||
*/
|
||||
static time_is_dst_result local_is_dst(const date_type&,
|
||||
const time_duration_type&)
|
||||
{
|
||||
return is_not_in_dst;
|
||||
}
|
||||
|
||||
//! Calculates if the given utc time is in dst
|
||||
static time_is_dst_result utc_is_dst(const date_type&,
|
||||
const time_duration_type&)
|
||||
static time_is_dst_result local_is_dst(const date_type&,
|
||||
const time_duration_type&)
|
||||
{
|
||||
return is_not_in_dst;
|
||||
}
|
||||
|
||||
static bool is_dst_boundary_day(date_type d)
|
||||
//! Calculates if the given utc time is in dst
|
||||
static time_is_dst_result utc_is_dst(const date_type&,
|
||||
const time_duration_type&)
|
||||
{
|
||||
return is_not_in_dst;
|
||||
}
|
||||
|
||||
static bool is_dst_boundary_day(date_type /*d*/)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static time_duration_type dst_offset()
|
||||
static time_duration_type dst_offset()
|
||||
{
|
||||
return time_duration_type(0,0,0);
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#ifndef DATE_TIME_DATE_DST_TRANSITION_DAY_GEN_HPP__
|
||||
#define DATE_TIME_DATE_DST_TRANSITION_DAY_GEN_HPP__
|
||||
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace boost {
|
||||
namespace date_time {
|
||||
@@ -18,7 +18,7 @@ namespace date_time {
|
||||
{
|
||||
public:
|
||||
typedef typename date_type::year_type year_type;
|
||||
virtual ~dst_day_calc_rule() {};
|
||||
virtual ~dst_day_calc_rule() {}
|
||||
virtual date_type start_day(year_type y) const=0;
|
||||
virtual std::string start_rule_as_string() const=0;
|
||||
virtual date_type end_day(year_type y) const=0;
|
||||
@@ -29,7 +29,7 @@ namespace date_time {
|
||||
//! Canonical form for a class that provides day rule calculation
|
||||
/*! This class is used to generate specific sets of dst rules
|
||||
*
|
||||
*@param spec Provides a specifiction of the function object types used
|
||||
*@tparam spec Provides a specifiction of the function object types used
|
||||
* to generate start and end days of daylight savings as well
|
||||
* as the date type.
|
||||
*/
|
||||
|
||||
@@ -19,10 +19,6 @@
|
||||
|
||||
#if defined(BOOST_HAS_FTIME) // skip this file if no FILETIME
|
||||
|
||||
#if defined(BOOST_USE_WINDOWS_H)
|
||||
# include <windows.h>
|
||||
#endif
|
||||
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/date_time/time.hpp>
|
||||
#include <boost/date_time/date_defs.hpp>
|
||||
@@ -31,85 +27,6 @@ namespace boost {
|
||||
|
||||
namespace date_time {
|
||||
|
||||
namespace winapi {
|
||||
|
||||
#if !defined(BOOST_USE_WINDOWS_H)
|
||||
|
||||
extern "C" {
|
||||
|
||||
struct FILETIME
|
||||
{
|
||||
boost::uint32_t dwLowDateTime;
|
||||
boost::uint32_t dwHighDateTime;
|
||||
};
|
||||
struct SYSTEMTIME
|
||||
{
|
||||
boost::uint16_t wYear;
|
||||
boost::uint16_t wMonth;
|
||||
boost::uint16_t wDayOfWeek;
|
||||
boost::uint16_t wDay;
|
||||
boost::uint16_t wHour;
|
||||
boost::uint16_t wMinute;
|
||||
boost::uint16_t wSecond;
|
||||
boost::uint16_t wMilliseconds;
|
||||
};
|
||||
|
||||
__declspec(dllimport) void __stdcall GetSystemTimeAsFileTime(FILETIME* lpFileTime);
|
||||
__declspec(dllimport) int __stdcall FileTimeToLocalFileTime(const FILETIME* lpFileTime, FILETIME* lpLocalFileTime);
|
||||
__declspec(dllimport) void __stdcall GetSystemTime(SYSTEMTIME* lpSystemTime);
|
||||
__declspec(dllimport) int __stdcall SystemTimeToFileTime(const SYSTEMTIME* lpSystemTime, FILETIME* lpFileTime);
|
||||
|
||||
} // extern "C"
|
||||
|
||||
#endif // defined(BOOST_USE_WINDOWS_H)
|
||||
|
||||
typedef FILETIME file_time;
|
||||
typedef SYSTEMTIME system_time;
|
||||
|
||||
inline void get_system_time_as_file_time(file_time& ft)
|
||||
{
|
||||
#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205))
|
||||
// Some runtime library implementations expect local times as the norm for ctime.
|
||||
file_time ft_utc;
|
||||
GetSystemTimeAsFileTime(&ft_utc);
|
||||
FileTimeToLocalFileTime(&ft_utc, &ft);
|
||||
#elif defined(BOOST_NO_GETSYSTEMTIMEASFILETIME)
|
||||
system_time st;
|
||||
GetSystemTime(&st);
|
||||
SystemTimeToFileTime(&st, &ft);
|
||||
#else
|
||||
GetSystemTimeAsFileTime(&ft);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* The function converts file_time into number of microseconds elapsed since 1970-Jan-01
|
||||
*
|
||||
* \note Only dates after 1970-Jan-01 are supported. Dates before will be wrapped.
|
||||
*
|
||||
* \note The function is templated on the FILETIME type, so that
|
||||
* it can be used with both native FILETIME and the ad-hoc
|
||||
* boost::date_time::winapi::file_time type.
|
||||
*/
|
||||
template< typename FileTimeT >
|
||||
inline boost::uint64_t file_time_to_microseconds(FileTimeT const& ft)
|
||||
{
|
||||
/* shift is difference between 1970-Jan-01 & 1601-Jan-01
|
||||
* in 100-nanosecond intervals */
|
||||
const uint64_t shift = 116444736000000000ULL; // (27111902 << 32) + 3577643008
|
||||
|
||||
union {
|
||||
FileTimeT as_file_time;
|
||||
uint64_t as_integer; // 100-nanos since 1601-Jan-01
|
||||
} caster;
|
||||
caster.as_file_time = ft;
|
||||
|
||||
caster.as_integer -= shift; // filetime is now 100-nanos since 1970-Jan-01
|
||||
return (caster.as_integer / 10); // truncate to microseconds
|
||||
}
|
||||
|
||||
} // namespace winapi
|
||||
|
||||
//! Create a time object from an initialized FILETIME struct.
|
||||
/*!
|
||||
* Create a time object from an initialized FILETIME struct.
|
||||
@@ -119,7 +36,7 @@ namespace winapi {
|
||||
*
|
||||
* \note The function is templated on the FILETIME type, so that
|
||||
* it can be used with both native FILETIME and the ad-hoc
|
||||
* boost::date_time::winapi::file_time type.
|
||||
* boost::detail::winapi::FILETIME_ type.
|
||||
*/
|
||||
template< typename TimeT, typename FileTimeT >
|
||||
inline
|
||||
@@ -132,20 +49,17 @@ TimeT time_from_ftime(const FileTimeT& ft)
|
||||
// https://svn.boost.org/trac/boost/ticket/2523
|
||||
// Since this function can be called with arbitrary times, including ones that
|
||||
// are before 1970-Jan-01, we'll have to cast the time a bit differently,
|
||||
// than it is done in the file_time_to_microseconds function. This allows to
|
||||
// than it is done in the microsec_clock::file_time_to_microseconds function. This allows to
|
||||
// avoid integer wrapping for dates before 1970-Jan-01.
|
||||
union {
|
||||
FileTimeT as_file_time;
|
||||
uint64_t as_integer; // 100-nanos since 1601-Jan-01
|
||||
} caster;
|
||||
caster.as_file_time = ft;
|
||||
|
||||
uint64_t sec = caster.as_integer / 10000000UL;
|
||||
uint32_t sub_sec = (caster.as_integer % 10000000UL) // 100-nanoseconds since the last second
|
||||
// 100-nanos since 1601-Jan-01
|
||||
uint64_t ft_as_integer = (static_cast< uint64_t >(ft.dwHighDateTime) << 32) | static_cast< uint64_t >(ft.dwLowDateTime);
|
||||
uint64_t sec = ft_as_integer / 10000000UL;
|
||||
uint32_t sub_sec = static_cast< uint32_t >(ft_as_integer % 10000000UL) // 100-nanoseconds since the last second
|
||||
#if !defined(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG)
|
||||
/ 10; // microseconds since the last second
|
||||
/ 10U; // microseconds since the last second
|
||||
#else
|
||||
* 100; // nanoseconds since the last second
|
||||
* 100U; // nanoseconds since the last second
|
||||
#endif
|
||||
|
||||
// split sec into usable chunks: days, hours, minutes, & seconds
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
#ifndef _BOOST_DATE_TIME_FIND_MATCH_HPP___
|
||||
#define _BOOST_DATE_TIME_FIND_MATCH_HPP___
|
||||
|
||||
/* Copyright (c) 2002,2003,2005 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
* Author: Jeff Garland, Bart Garst
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace boost {
|
||||
namespace date_time {
|
||||
|
||||
|
||||
//! Find index of a string in either of 2 arrays
|
||||
/*! find_match searches both arrays for a match to 's'. Both arrays
|
||||
* must contain 'size' elements. The index of the match is returned.
|
||||
* If no match is found, 'size' is returned.
|
||||
* Ex. "Jan" returns 0, "Dec" returns 11, "Tue" returns 2.
|
||||
* 'size' can be sent in with: (greg_month::max)() (which 12),
|
||||
* (greg_weekday::max)() + 1 (which is 7) or date_time::NumSpecialValues */
|
||||
template<class charT>
|
||||
short find_match(const charT* const* short_names,
|
||||
const charT* const* long_names,
|
||||
short size,
|
||||
const std::basic_string<charT>& s) {
|
||||
for(short i = 0; i < size; ++i){
|
||||
if(short_names[i] == s || long_names[i] == s){
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return size; // not-found, return a value out of range
|
||||
}
|
||||
|
||||
|
||||
} } //namespace date_time
|
||||
|
||||
|
||||
#endif
|
||||
@@ -3,7 +3,7 @@
|
||||
#define DATE_TIME_FORMAT_DATE_PARSER_HPP__
|
||||
|
||||
/* Copyright (c) 2004-2005 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
* Author: Jeff Garland, Bart Garst
|
||||
@@ -32,11 +32,11 @@ namespace std {
|
||||
}
|
||||
#endif
|
||||
namespace boost { namespace date_time {
|
||||
|
||||
|
||||
//! Helper function for parsing fixed length strings into integers
|
||||
/*! Will consume 'length' number of characters from stream. Consumed
|
||||
* character are transfered to parse_match_result struct.
|
||||
* Returns '-1' if no number can be parsed or incorrect number of
|
||||
/*! Will consume 'length' number of characters from stream. Consumed
|
||||
* character are transfered to parse_match_result struct.
|
||||
* Returns '-1' if no number can be parsed or incorrect number of
|
||||
* digits in stream. */
|
||||
template<typename int_type, typename charT>
|
||||
inline
|
||||
@@ -50,12 +50,12 @@ fixed_string_to_int(std::istreambuf_iterator<charT>& itr,
|
||||
//typedef std::basic_string<charT> string_type;
|
||||
unsigned int j = 0;
|
||||
//string_type s;
|
||||
while (j < length && itr != stream_end &&
|
||||
while (j < length && itr != stream_end &&
|
||||
(std::isdigit(*itr) || *itr == fill_char)) {
|
||||
if(*itr == fill_char) {
|
||||
/* Since a fill_char can be anything, we convert it to a zero.
|
||||
/* Since a fill_char can be anything, we convert it to a zero.
|
||||
* lexical_cast will behave predictably when zero is used as fill. */
|
||||
mr.cache += ('0');
|
||||
mr.cache += ('0');
|
||||
}
|
||||
else {
|
||||
mr.cache += (*itr);
|
||||
@@ -63,7 +63,7 @@ fixed_string_to_int(std::istreambuf_iterator<charT>& itr,
|
||||
itr++;
|
||||
j++;
|
||||
}
|
||||
int_type i = -1;
|
||||
int_type i = static_cast<int_type>(-1);
|
||||
// mr.cache will hold leading zeros. size() tells us when input is too short.
|
||||
if(mr.cache.size() < length) {
|
||||
return i;
|
||||
@@ -77,9 +77,9 @@ fixed_string_to_int(std::istreambuf_iterator<charT>& itr,
|
||||
}
|
||||
|
||||
//! Helper function for parsing fixed length strings into integers
|
||||
/*! Will consume 'length' number of characters from stream. Consumed
|
||||
* character are transfered to parse_match_result struct.
|
||||
* Returns '-1' if no number can be parsed or incorrect number of
|
||||
/*! Will consume 'length' number of characters from stream. Consumed
|
||||
* character are transfered to parse_match_result struct.
|
||||
* Returns '-1' if no number can be parsed or incorrect number of
|
||||
* digits in stream. */
|
||||
template<typename int_type, typename charT>
|
||||
inline
|
||||
@@ -93,8 +93,8 @@ fixed_string_to_int(std::istreambuf_iterator<charT>& itr,
|
||||
}
|
||||
|
||||
//! Helper function for parsing varied length strings into integers
|
||||
/*! Will consume 'max_length' characters from stream only if those
|
||||
* characters are digits. Returns '-1' if no number can be parsed.
|
||||
/*! Will consume 'max_length' characters from stream only if those
|
||||
* characters are digits. Returns '-1' if no number can be parsed.
|
||||
* Will not parse a number preceeded by a '+' or '-'. */
|
||||
template<typename int_type, typename charT>
|
||||
inline
|
||||
@@ -111,7 +111,7 @@ var_string_to_int(std::istreambuf_iterator<charT>& itr,
|
||||
++itr;
|
||||
++j;
|
||||
}
|
||||
int_type i = -1;
|
||||
int_type i = static_cast<int_type>(-1);
|
||||
if(!s.empty()) {
|
||||
i = boost::lexical_cast<int_type>(s);
|
||||
}
|
||||
@@ -133,7 +133,7 @@ var_string_to_int(std::istreambuf_iterator<charT>& itr,
|
||||
- %W - Week number 00 to 53 where Monday is first day of week 1
|
||||
- %x - facet default date representation
|
||||
- %y - Year without the century - eg: 04 for 2004
|
||||
- %Y - Year with century
|
||||
- %Y - Year with century
|
||||
|
||||
The weekday specifiers (%a and %A) do not add to the date construction,
|
||||
but they provide a way to skip over the weekday names for formats that
|
||||
@@ -142,7 +142,7 @@ var_string_to_int(std::istreambuf_iterator<charT>& itr,
|
||||
todo -- Another interesting feature that this approach could provide is
|
||||
an option to fill in any missing fields with the current values
|
||||
from the clock. So if you have %m-%d the parser would detect
|
||||
the missing year value and fill it in using the clock.
|
||||
the missing year value and fill it in using the clock.
|
||||
|
||||
todo -- What to do with the %x. %x in the classic facet is just bad...
|
||||
|
||||
@@ -166,7 +166,7 @@ class format_date_parser
|
||||
typedef std::vector<std::basic_string<charT> > input_collection_type;
|
||||
|
||||
// TODO sv_parser uses its default constructor - write the others
|
||||
|
||||
|
||||
format_date_parser(const string_type& format_str,
|
||||
const input_collection_type& month_short_names,
|
||||
const input_collection_type& month_long_names,
|
||||
@@ -178,7 +178,7 @@ class format_date_parser
|
||||
m_weekday_short_names(weekday_short_names),
|
||||
m_weekday_long_names(weekday_long_names)
|
||||
{}
|
||||
|
||||
|
||||
format_date_parser(const string_type& format_str,
|
||||
const std::locale& locale) :
|
||||
m_format(format_str),
|
||||
@@ -196,7 +196,7 @@ class format_date_parser
|
||||
this->m_weekday_short_names = fdp.m_weekday_short_names;
|
||||
this->m_weekday_long_names = fdp.m_weekday_long_names;
|
||||
}
|
||||
|
||||
|
||||
string_type format() const
|
||||
{
|
||||
return m_format;
|
||||
@@ -225,7 +225,7 @@ class format_date_parser
|
||||
}
|
||||
|
||||
date_type
|
||||
parse_date(const string_type& value,
|
||||
parse_date(const string_type& value,
|
||||
const string_type& format_str,
|
||||
const special_values_parser<date_type,charT>& sv_parser) const
|
||||
{
|
||||
@@ -236,49 +236,49 @@ class format_date_parser
|
||||
}
|
||||
|
||||
date_type
|
||||
parse_date(std::istreambuf_iterator<charT>& sitr,
|
||||
parse_date(std::istreambuf_iterator<charT>& sitr,
|
||||
std::istreambuf_iterator<charT>& stream_end,
|
||||
const special_values_parser<date_type,charT>& sv_parser) const
|
||||
{
|
||||
return parse_date(sitr, stream_end, m_format, sv_parser);
|
||||
}
|
||||
|
||||
/*! Of all the objects that the format_date_parser can parse, only a
|
||||
* date can be a special value. Therefore, only parse_date checks
|
||||
/*! Of all the objects that the format_date_parser can parse, only a
|
||||
* date can be a special value. Therefore, only parse_date checks
|
||||
* for special_values. */
|
||||
date_type
|
||||
parse_date(std::istreambuf_iterator<charT>& sitr,
|
||||
parse_date(std::istreambuf_iterator<charT>& sitr,
|
||||
std::istreambuf_iterator<charT>& stream_end,
|
||||
string_type format_str,
|
||||
const special_values_parser<date_type,charT>& sv_parser) const
|
||||
{
|
||||
bool use_current_char = false;
|
||||
|
||||
// skip leading whitespace
|
||||
while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
|
||||
charT current_char = *sitr;
|
||||
|
||||
short year(0), month(0), day(0), day_of_year(0);// wkday(0);
|
||||
/* Initialized the following to their minimum values. These intermediate
|
||||
* objects are used so we get specific exceptions when part of the input
|
||||
* is unparsable.
|
||||
// skip leading whitespace
|
||||
while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
|
||||
|
||||
short year(0), month(0), day(0), day_of_year(0);// wkday(0);
|
||||
/* Initialized the following to their minimum values. These intermediate
|
||||
* objects are used so we get specific exceptions when part of the input
|
||||
* is unparsable.
|
||||
* Ex: "205-Jan-15" will throw a bad_year, "2005-Jsn-15"- bad_month, etc.*/
|
||||
year_type t_year(1400);
|
||||
month_type t_month(1);
|
||||
day_type t_day(1);
|
||||
day_of_week_type wkday(0);
|
||||
|
||||
|
||||
|
||||
|
||||
const_itr itr(format_str.begin());
|
||||
while (itr != format_str.end() && (sitr != stream_end)) {
|
||||
if (*itr == '%') {
|
||||
itr++;
|
||||
if ( ++itr == format_str.end())
|
||||
break;
|
||||
if (*itr != '%') {
|
||||
switch(*itr) {
|
||||
case 'a':
|
||||
case 'a':
|
||||
{
|
||||
//this value is just throw away. It could be used for
|
||||
//error checking potentially, but it isn't helpful in
|
||||
//error checking potentially, but it isn't helpful in
|
||||
//actually constructing the date - we just need to get it
|
||||
//out of the stream
|
||||
match_results mr = m_weekday_short_names.match(sitr, stream_end);
|
||||
@@ -290,15 +290,14 @@ class format_date_parser
|
||||
}
|
||||
wkday = mr.current_match;
|
||||
if (mr.has_remaining()) {
|
||||
current_char = mr.last_char();
|
||||
use_current_char = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'A':
|
||||
case 'A':
|
||||
{
|
||||
//this value is just throw away. It could be used for
|
||||
//error checking potentially, but it isn't helpful in
|
||||
//error checking potentially, but it isn't helpful in
|
||||
//actually constructing the date - we just need to get it
|
||||
//out of the stream
|
||||
match_results mr = m_weekday_long_names.match(sitr, stream_end);
|
||||
@@ -310,12 +309,11 @@ class format_date_parser
|
||||
}
|
||||
wkday = mr.current_match;
|
||||
if (mr.has_remaining()) {
|
||||
current_char = mr.last_char();
|
||||
use_current_char = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'b':
|
||||
case 'b':
|
||||
{
|
||||
match_results mr = m_month_short_names.match(sitr, stream_end);
|
||||
if(mr.current_match == match_results::PARSE_ERROR) {
|
||||
@@ -326,12 +324,11 @@ class format_date_parser
|
||||
}
|
||||
t_month = month_type(mr.current_match);
|
||||
if (mr.has_remaining()) {
|
||||
current_char = mr.last_char();
|
||||
use_current_char = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'B':
|
||||
case 'B':
|
||||
{
|
||||
match_results mr = m_month_long_names.match(sitr, stream_end);
|
||||
if(mr.current_match == match_results::PARSE_ERROR) {
|
||||
@@ -342,12 +339,11 @@ class format_date_parser
|
||||
}
|
||||
t_month = month_type(mr.current_match);
|
||||
if (mr.has_remaining()) {
|
||||
current_char = mr.last_char();
|
||||
use_current_char = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'd':
|
||||
case 'd':
|
||||
{
|
||||
match_results mr;
|
||||
day = fixed_string_to_int<short, charT>(sitr, stream_end, mr, 2);
|
||||
@@ -359,7 +355,7 @@ class format_date_parser
|
||||
t_day = day_type(day);
|
||||
break;
|
||||
}
|
||||
case 'e':
|
||||
case 'e':
|
||||
{
|
||||
match_results mr;
|
||||
day = fixed_string_to_int<short, charT>(sitr, stream_end, mr, 2, ' ');
|
||||
@@ -371,7 +367,7 @@ class format_date_parser
|
||||
t_day = day_type(day);
|
||||
break;
|
||||
}
|
||||
case 'j':
|
||||
case 'j':
|
||||
{
|
||||
match_results mr;
|
||||
day_of_year = fixed_string_to_int<short, charT>(sitr, stream_end, mr, 3);
|
||||
@@ -385,7 +381,7 @@ class format_date_parser
|
||||
t_day_of_year = day_of_year_type(day_of_year);
|
||||
break;
|
||||
}
|
||||
case 'm':
|
||||
case 'm':
|
||||
{
|
||||
match_results mr;
|
||||
month = fixed_string_to_int<short, charT>(sitr, stream_end, mr, 2);
|
||||
@@ -397,7 +393,7 @@ class format_date_parser
|
||||
t_month = month_type(month);
|
||||
break;
|
||||
}
|
||||
case 'Y':
|
||||
case 'Y':
|
||||
{
|
||||
match_results mr;
|
||||
year = fixed_string_to_int<short, charT>(sitr, stream_end, mr, 4);
|
||||
@@ -409,7 +405,7 @@ class format_date_parser
|
||||
t_year = year_type(year);
|
||||
break;
|
||||
}
|
||||
case 'y':
|
||||
case 'y':
|
||||
{
|
||||
match_results mr;
|
||||
year = fixed_string_to_int<short, charT>(sitr, stream_end, mr, 2);
|
||||
@@ -424,139 +420,135 @@ class format_date_parser
|
||||
}
|
||||
default:
|
||||
{} //ignore those we don't understand
|
||||
|
||||
|
||||
}//switch
|
||||
|
||||
|
||||
}
|
||||
else { // itr == '%', second consecutive
|
||||
sitr++;
|
||||
}
|
||||
|
||||
|
||||
itr++; //advance past format specifier
|
||||
}
|
||||
else { //skip past chars in format and in buffer
|
||||
itr++;
|
||||
if (use_current_char) {
|
||||
use_current_char = false;
|
||||
current_char = *sitr;
|
||||
}
|
||||
else {
|
||||
sitr++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (day_of_year > 0) {
|
||||
date_type d(static_cast<unsigned short>(year-1),12,31); //end of prior year
|
||||
return d + duration_type(day_of_year);
|
||||
}
|
||||
|
||||
return date_type(t_year, t_month, t_day); // exceptions were thrown earlier
|
||||
// if input was no good
|
||||
|
||||
return date_type(t_year, t_month, t_day); // exceptions were thrown earlier
|
||||
// if input was no good
|
||||
}
|
||||
|
||||
|
||||
//! Throws bad_month if unable to parse
|
||||
month_type
|
||||
parse_month(std::istreambuf_iterator<charT>& sitr,
|
||||
parse_month(std::istreambuf_iterator<charT>& sitr,
|
||||
std::istreambuf_iterator<charT>& stream_end,
|
||||
string_type format_str) const
|
||||
{
|
||||
match_results mr;
|
||||
return parse_month(sitr, stream_end, format_str, mr);
|
||||
}
|
||||
|
||||
|
||||
//! Throws bad_month if unable to parse
|
||||
month_type
|
||||
parse_month(std::istreambuf_iterator<charT>& sitr,
|
||||
parse_month(std::istreambuf_iterator<charT>& sitr,
|
||||
std::istreambuf_iterator<charT>& stream_end,
|
||||
string_type format_str,
|
||||
match_results& mr) const
|
||||
{
|
||||
bool use_current_char = false;
|
||||
|
||||
|
||||
// skip leading whitespace
|
||||
while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
|
||||
charT current_char = *sitr;
|
||||
while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
|
||||
|
||||
short month(0);
|
||||
|
||||
|
||||
const_itr itr(format_str.begin());
|
||||
while (itr != format_str.end() && (sitr != stream_end)) {
|
||||
if (*itr == '%') {
|
||||
itr++;
|
||||
if ( ++itr == format_str.end())
|
||||
break;
|
||||
if (*itr != '%') {
|
||||
switch(*itr) {
|
||||
case 'b':
|
||||
case 'b':
|
||||
{
|
||||
mr = m_month_short_names.match(sitr, stream_end);
|
||||
month = mr.current_match;
|
||||
if (mr.has_remaining()) {
|
||||
current_char = mr.last_char();
|
||||
use_current_char = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'B':
|
||||
case 'B':
|
||||
{
|
||||
mr = m_month_long_names.match(sitr, stream_end);
|
||||
month = mr.current_match;
|
||||
if (mr.has_remaining()) {
|
||||
current_char = mr.last_char();
|
||||
use_current_char = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'm':
|
||||
case 'm':
|
||||
{
|
||||
month = var_string_to_int<short, charT>(sitr, stream_end, 2);
|
||||
// var_string_to_int returns -1 if parse failed. That will
|
||||
// var_string_to_int returns -1 if parse failed. That will
|
||||
// cause a bad_month exception to be thrown so we do nothing here
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{} //ignore those we don't understand
|
||||
|
||||
|
||||
}//switch
|
||||
|
||||
|
||||
}
|
||||
else { // itr == '%', second consecutive
|
||||
sitr++;
|
||||
}
|
||||
|
||||
|
||||
itr++; //advance past format specifier
|
||||
}
|
||||
else { //skip past chars in format and in buffer
|
||||
itr++;
|
||||
if (use_current_char) {
|
||||
use_current_char = false;
|
||||
current_char = *sitr;
|
||||
}
|
||||
else {
|
||||
sitr++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return month_type(month); // throws bad_month exception when values are zero
|
||||
}
|
||||
|
||||
//! Expects 1 or 2 digits 1-31. Throws bad_day_of_month if unable to parse
|
||||
day_type
|
||||
parse_var_day_of_month(std::istreambuf_iterator<charT>& sitr,
|
||||
parse_var_day_of_month(std::istreambuf_iterator<charT>& sitr,
|
||||
std::istreambuf_iterator<charT>& stream_end) const
|
||||
{
|
||||
// skip leading whitespace
|
||||
while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
|
||||
while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
|
||||
|
||||
return day_type(var_string_to_int<short, charT>(sitr, stream_end, 2));
|
||||
}
|
||||
//! Expects 2 digits 01-31. Throws bad_day_of_month if unable to parse
|
||||
day_type
|
||||
parse_day_of_month(std::istreambuf_iterator<charT>& sitr,
|
||||
parse_day_of_month(std::istreambuf_iterator<charT>& sitr,
|
||||
std::istreambuf_iterator<charT>& stream_end) const
|
||||
{
|
||||
// skip leading whitespace
|
||||
while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
|
||||
while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
|
||||
|
||||
//return day_type(var_string_to_int<short, charT>(sitr, stream_end, 2));
|
||||
match_results mr;
|
||||
@@ -564,7 +556,7 @@ class format_date_parser
|
||||
}
|
||||
|
||||
day_of_week_type
|
||||
parse_weekday(std::istreambuf_iterator<charT>& sitr,
|
||||
parse_weekday(std::istreambuf_iterator<charT>& sitr,
|
||||
std::istreambuf_iterator<charT>& stream_end,
|
||||
string_type format_str) const
|
||||
{
|
||||
@@ -572,49 +564,47 @@ class format_date_parser
|
||||
return parse_weekday(sitr, stream_end, format_str, mr);
|
||||
}
|
||||
day_of_week_type
|
||||
parse_weekday(std::istreambuf_iterator<charT>& sitr,
|
||||
parse_weekday(std::istreambuf_iterator<charT>& sitr,
|
||||
std::istreambuf_iterator<charT>& stream_end,
|
||||
string_type format_str,
|
||||
match_results& mr) const
|
||||
{
|
||||
bool use_current_char = false;
|
||||
|
||||
|
||||
// skip leading whitespace
|
||||
while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
|
||||
charT current_char = *sitr;
|
||||
while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
|
||||
|
||||
short wkday(0);
|
||||
|
||||
|
||||
const_itr itr(format_str.begin());
|
||||
while (itr != format_str.end() && (sitr != stream_end)) {
|
||||
if (*itr == '%') {
|
||||
itr++;
|
||||
if ( ++itr == format_str.end())
|
||||
break;
|
||||
if (*itr != '%') {
|
||||
switch(*itr) {
|
||||
case 'a':
|
||||
case 'a':
|
||||
{
|
||||
//this value is just throw away. It could be used for
|
||||
//error checking potentially, but it isn't helpful in
|
||||
//error checking potentially, but it isn't helpful in
|
||||
//actually constructing the date - we just need to get it
|
||||
//out of the stream
|
||||
mr = m_weekday_short_names.match(sitr, stream_end);
|
||||
wkday = mr.current_match;
|
||||
if (mr.has_remaining()) {
|
||||
current_char = mr.last_char();
|
||||
use_current_char = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'A':
|
||||
case 'A':
|
||||
{
|
||||
//this value is just throw away. It could be used for
|
||||
//error checking potentially, but it isn't helpful in
|
||||
//error checking potentially, but it isn't helpful in
|
||||
//actually constructing the date - we just need to get it
|
||||
//out of the stream
|
||||
mr = m_weekday_long_names.match(sitr, stream_end);
|
||||
wkday = mr.current_match;
|
||||
if (mr.has_remaining()) {
|
||||
current_char = mr.last_char();
|
||||
use_current_char = true;
|
||||
}
|
||||
break;
|
||||
@@ -627,35 +617,34 @@ class format_date_parser
|
||||
}
|
||||
default:
|
||||
{} //ignore those we don't understand
|
||||
|
||||
|
||||
}//switch
|
||||
|
||||
|
||||
}
|
||||
else { // itr == '%', second consecutive
|
||||
sitr++;
|
||||
}
|
||||
|
||||
|
||||
itr++; //advance past format specifier
|
||||
}
|
||||
else { //skip past chars in format and in buffer
|
||||
itr++;
|
||||
if (use_current_char) {
|
||||
use_current_char = false;
|
||||
current_char = *sitr;
|
||||
}
|
||||
else {
|
||||
sitr++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return day_of_week_type(wkday); // throws bad_day_of_month exception
|
||||
|
||||
return day_of_week_type(wkday); // throws bad_day_of_month exception
|
||||
// when values are zero
|
||||
}
|
||||
|
||||
|
||||
//! throws bad_year if unable to parse
|
||||
year_type
|
||||
parse_year(std::istreambuf_iterator<charT>& sitr,
|
||||
parse_year(std::istreambuf_iterator<charT>& sitr,
|
||||
std::istreambuf_iterator<charT>& stream_end,
|
||||
string_type format_str) const
|
||||
{
|
||||
@@ -665,23 +654,21 @@ class format_date_parser
|
||||
|
||||
//! throws bad_year if unable to parse
|
||||
year_type
|
||||
parse_year(std::istreambuf_iterator<charT>& sitr,
|
||||
parse_year(std::istreambuf_iterator<charT>& sitr,
|
||||
std::istreambuf_iterator<charT>& stream_end,
|
||||
string_type format_str,
|
||||
match_results& mr) const
|
||||
{
|
||||
bool use_current_char = false;
|
||||
|
||||
// skip leading whitespace
|
||||
while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
|
||||
charT current_char = *sitr;
|
||||
while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
|
||||
|
||||
unsigned short year(0);
|
||||
|
||||
|
||||
const_itr itr(format_str.begin());
|
||||
while (itr != format_str.end() && (sitr != stream_end)) {
|
||||
if (*itr == '%') {
|
||||
itr++;
|
||||
if ( ++itr == format_str.end())
|
||||
break;
|
||||
if (*itr != '%') {
|
||||
//match_results mr;
|
||||
switch(*itr) {
|
||||
@@ -700,32 +687,26 @@ class format_date_parser
|
||||
}
|
||||
default:
|
||||
{} //ignore those we don't understand
|
||||
|
||||
|
||||
}//switch
|
||||
|
||||
|
||||
}
|
||||
else { // itr == '%', second consecutive
|
||||
sitr++;
|
||||
}
|
||||
|
||||
|
||||
itr++; //advance past format specifier
|
||||
}
|
||||
else { //skip past chars in format and in buffer
|
||||
itr++;
|
||||
if (use_current_char) {
|
||||
use_current_char = false;
|
||||
current_char = *sitr;
|
||||
}
|
||||
else {
|
||||
sitr++;
|
||||
}
|
||||
sitr++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return year_type(year); // throws bad_year exception when values are zero
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private:
|
||||
string_type m_format;
|
||||
parse_tree_type m_month_short_names;
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
#include <stdexcept>
|
||||
#include <boost/throw_exception.hpp>
|
||||
@@ -41,7 +42,8 @@ namespace gregorian {
|
||||
boost::throw_exception(std::out_of_range(s));
|
||||
}
|
||||
|
||||
std::tm datetm = {}; // zero initialization is needed for extension members, like tm_zone
|
||||
std::tm datetm;
|
||||
std::memset(&datetm, 0, sizeof(datetm));
|
||||
boost::gregorian::date::ymd_type ymd = d.year_month_day();
|
||||
datetm.tm_year = ymd.year - 1900;
|
||||
datetm.tm_mon = ymd.month - 1;
|
||||
|
||||
@@ -65,7 +65,7 @@ namespace gregorian {
|
||||
std::basic_string<charT> s(date_time::date_formatter<date,date_time::iso_format<charT>,charT>::date_to_string(d.begin()));
|
||||
return s + sep + date_time::date_formatter<date,date_time::iso_format<charT>,charT>::date_to_string(d.last());
|
||||
}
|
||||
//! Date period to iso standard format CCYYMMDD/CCYYMMDD. Example: 20021225/20021231
|
||||
//! Date period to ISO 8601 standard format CCYYMMDD/CCYYMMDD. Example: 20021225/20021231
|
||||
/*!\ingroup date_format
|
||||
*/
|
||||
inline std::string to_iso_string(const date_period& d) {
|
||||
@@ -78,7 +78,7 @@ namespace gregorian {
|
||||
inline std::basic_string<charT> to_iso_extended_string_type(const date& d) {
|
||||
return date_time::date_formatter<date,date_time::iso_extended_format<charT>,charT>::date_to_string(d);
|
||||
}
|
||||
//! Convert to iso extended format string CCYY-MM-DD. Example 2002-12-31
|
||||
//! Convert to ISO 8601 extended format string CCYY-MM-DD. Example 2002-12-31
|
||||
/*!\ingroup date_format
|
||||
*/
|
||||
inline std::string to_iso_extended_string(const date& d) {
|
||||
@@ -90,7 +90,7 @@ namespace gregorian {
|
||||
inline std::basic_string<charT> to_iso_string_type(const date& d) {
|
||||
return date_time::date_formatter<date,date_time::iso_format<charT>,charT>::date_to_string(d);
|
||||
}
|
||||
//! Convert to iso standard string YYYYMMDD. Example: 20021231
|
||||
//! Convert to ISO 8601 standard string YYYYMMDD. Example: 20021231
|
||||
/*!\ingroup date_format
|
||||
*/
|
||||
inline std::string to_iso_string(const date& d) {
|
||||
|
||||
@@ -35,7 +35,7 @@ namespace gregorian {
|
||||
return std::string("[" + d1 + "/" + d2 + "]");
|
||||
}
|
||||
|
||||
//! Date period to iso standard format CCYYMMDD/CCYYMMDD. Example: 20021225/20021231
|
||||
//! Date period to ISO 8601 standard format CCYYMMDD/CCYYMMDD. Example: 20021225/20021231
|
||||
/*!\ingroup date_format
|
||||
*/
|
||||
inline std::string to_iso_string(const date_period& d) {
|
||||
@@ -44,14 +44,14 @@ namespace gregorian {
|
||||
}
|
||||
|
||||
|
||||
//! Convert to iso extended format string CCYY-MM-DD. Example 2002-12-31
|
||||
//! Convert to ISO 8601 extended format string CCYY-MM-DD. Example 2002-12-31
|
||||
/*!\ingroup date_format
|
||||
*/
|
||||
inline std::string to_iso_extended_string(const date& d) {
|
||||
return date_time::date_formatter<date,date_time::iso_extended_format<char> >::date_to_string(d);
|
||||
}
|
||||
|
||||
//! Convert to iso standard string YYYYMMDD. Example: 20021231
|
||||
//! Convert to ISO 8601 standard string YYYYMMDD. Example: 20021231
|
||||
/*!\ingroup date_format
|
||||
*/
|
||||
inline std::string to_iso_string(const date& d) {
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
*/
|
||||
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/gregorian/greg_weekday.hpp>
|
||||
#include <boost/date_time/gregorian/greg_day_of_year.hpp>
|
||||
#include <boost/date_time/gregorian_calendar.hpp>
|
||||
@@ -23,7 +24,7 @@ namespace gregorian {
|
||||
typedef date_time::int_adapter<uint32_t> fancy_date_rep;
|
||||
|
||||
//! Gregorian calendar for this implementation, hard work in the base
|
||||
class gregorian_calendar :
|
||||
class BOOST_SYMBOL_VISIBLE gregorian_calendar :
|
||||
public date_time::gregorian_calendar_base<greg_year_month_day, fancy_date_rep::int_type> {
|
||||
public:
|
||||
//! Type to hold a weekday (eg: Sunday, Monday,...)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef GREG_DATE_HPP___
|
||||
#define GREG_DATE_HPP___
|
||||
|
||||
/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
|
||||
/* Copyright (c) 2002,2003, 2020 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
@@ -10,6 +10,7 @@
|
||||
*/
|
||||
|
||||
#include <boost/throw_exception.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/date.hpp>
|
||||
#include <boost/date_time/special_defs.hpp>
|
||||
#include <boost/date_time/gregorian/greg_calendar.hpp>
|
||||
@@ -34,7 +35,7 @@ namespace gregorian {
|
||||
supported.
|
||||
\ingroup date_basics
|
||||
*/
|
||||
class date : public date_time::date<date, gregorian_calendar, date_duration>
|
||||
class BOOST_SYMBOL_VISIBLE date : public date_time::date<date, gregorian_calendar, date_duration>
|
||||
{
|
||||
public:
|
||||
typedef gregorian_calendar::year_type year_type;
|
||||
@@ -47,12 +48,12 @@ namespace gregorian {
|
||||
typedef date_duration duration_type;
|
||||
#if !defined(DATE_TIME_NO_DEFAULT_CONSTRUCTOR)
|
||||
//! Default constructor constructs with not_a_date_time
|
||||
date():
|
||||
BOOST_CXX14_CONSTEXPR date():
|
||||
date_time::date<date, gregorian_calendar, date_duration>(date_rep_type::from_special(not_a_date_time))
|
||||
{}
|
||||
#endif // DATE_TIME_NO_DEFAULT_CONSTRUCTOR
|
||||
//! Main constructor with year, month, day
|
||||
date(year_type y, month_type m, day_type d)
|
||||
BOOST_CXX14_CONSTEXPR date(year_type y, month_type m, day_type d)
|
||||
: date_time::date<date, gregorian_calendar, date_duration>(y, m, d)
|
||||
{
|
||||
if (gregorian_calendar::end_of_month_day(y, m) < d) {
|
||||
@@ -60,73 +61,80 @@ namespace gregorian {
|
||||
}
|
||||
}
|
||||
//! Constructor from a ymd_type structure
|
||||
explicit date(const ymd_type& ymd)
|
||||
BOOST_CXX14_CONSTEXPR explicit date(const ymd_type& ymd)
|
||||
: date_time::date<date, gregorian_calendar, date_duration>(ymd)
|
||||
{}
|
||||
//! Needed copy constructor
|
||||
explicit date(const date_int_type& rhs):
|
||||
BOOST_CXX14_CONSTEXPR explicit date(const date_int_type& rhs):
|
||||
date_time::date<date,gregorian_calendar, date_duration>(rhs)
|
||||
{}
|
||||
//! Needed copy constructor
|
||||
explicit date(date_rep_type rhs):
|
||||
BOOST_CXX14_CONSTEXPR explicit date(date_rep_type rhs):
|
||||
date_time::date<date,gregorian_calendar, date_duration>(rhs)
|
||||
{}
|
||||
//! Constructor for infinities, not a date, max and min date
|
||||
explicit date(special_values sv):
|
||||
date_time::date<date, gregorian_calendar, date_duration>(date_rep_type::from_special(sv))
|
||||
{
|
||||
if (sv == min_date_time)
|
||||
{
|
||||
*this = date(1400, 1, 1);
|
||||
}
|
||||
if (sv == max_date_time)
|
||||
{
|
||||
*this = date(9999, 12, 31);
|
||||
}
|
||||
|
||||
}
|
||||
BOOST_CXX14_CONSTEXPR explicit date(special_values sv):
|
||||
date_time::date<date, gregorian_calendar, date_duration>(from_special_adjusted(sv))
|
||||
{}
|
||||
//!Return the Julian Day number for the date.
|
||||
date_int_type julian_day() const
|
||||
BOOST_CXX14_CONSTEXPR date_int_type julian_day() const
|
||||
{
|
||||
ymd_type ymd = year_month_day();
|
||||
return gregorian_calendar::julian_day_number(ymd);
|
||||
}
|
||||
//!Return the day of year 1..365 or 1..366 (for leap year)
|
||||
day_of_year_type day_of_year() const
|
||||
BOOST_CXX14_CONSTEXPR day_of_year_type day_of_year() const
|
||||
{
|
||||
date start_of_year(year(), 1, 1);
|
||||
unsigned short doy = static_cast<unsigned short>((*this-start_of_year).days() + 1);
|
||||
return day_of_year_type(doy);
|
||||
}
|
||||
//!Return the Modified Julian Day number for the date.
|
||||
date_int_type modjulian_day() const
|
||||
BOOST_CXX14_CONSTEXPR date_int_type modjulian_day() const
|
||||
{
|
||||
ymd_type ymd = year_month_day();
|
||||
return gregorian_calendar::modjulian_day_number(ymd);
|
||||
}
|
||||
//!Return the iso 8601 week number 1..53
|
||||
int week_number() const
|
||||
//!Return the ISO 8601 week number 1..53
|
||||
BOOST_CXX14_CONSTEXPR int week_number() const
|
||||
{
|
||||
ymd_type ymd = year_month_day();
|
||||
return gregorian_calendar::week_number(ymd);
|
||||
}
|
||||
//! Return the day number from the calendar
|
||||
date_int_type day_number() const
|
||||
BOOST_CXX14_CONSTEXPR date_int_type day_number() const
|
||||
{
|
||||
return days_;
|
||||
}
|
||||
//! Return the last day of the current month
|
||||
date end_of_month() const
|
||||
BOOST_CXX14_CONSTEXPR date end_of_month() const
|
||||
{
|
||||
ymd_type ymd = year_month_day();
|
||||
short eom_day = gregorian_calendar::end_of_month_day(ymd.year, ymd.month);
|
||||
unsigned short eom_day = gregorian_calendar::end_of_month_day(ymd.year, ymd.month);
|
||||
return date(ymd.year, ymd.month, eom_day);
|
||||
}
|
||||
|
||||
friend BOOST_CXX14_CONSTEXPR
|
||||
bool operator==(const date& lhs, const date& rhs);
|
||||
|
||||
private:
|
||||
|
||||
BOOST_CXX14_CONSTEXPR date_rep_type from_special_adjusted(special_values sv)
|
||||
{
|
||||
switch (sv)
|
||||
{
|
||||
case min_date_time: return gregorian_calendar::day_number(ymd_type(1400, 1, 1));
|
||||
case max_date_time: return gregorian_calendar::day_number(ymd_type(9999, 12, 31));
|
||||
default: return date_rep_type::from_special(sv);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
bool operator==(const date& lhs, const date& rhs)
|
||||
{
|
||||
return lhs.days_ == rhs.days_;
|
||||
}
|
||||
|
||||
|
||||
} } //namespace gregorian
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef GREG_DAY_HPP___
|
||||
#define GREG_DAY_HPP___
|
||||
|
||||
/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
|
||||
/* Copyright (c) 2002,2003,2020 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
@@ -9,7 +9,8 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include "boost/date_time/constrained_value.hpp"
|
||||
#include <boost/date_time/constrained_value.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
|
||||
@@ -17,7 +18,7 @@ namespace boost {
|
||||
namespace gregorian {
|
||||
|
||||
//! Exception type for gregorian day of month (1..31)
|
||||
struct bad_day_of_month : public std::out_of_range
|
||||
struct BOOST_SYMBOL_VISIBLE bad_day_of_month : public std::out_of_range
|
||||
{
|
||||
bad_day_of_month() :
|
||||
std::out_of_range(std::string("Day of month value is out of range 1..31"))
|
||||
@@ -39,11 +40,11 @@ namespace gregorian {
|
||||
is automatically range checked so values outside of the range 1-31
|
||||
will cause a bad_day_of_month exception
|
||||
*/
|
||||
class greg_day : public greg_day_rep {
|
||||
class BOOST_SYMBOL_VISIBLE greg_day : public greg_day_rep {
|
||||
public:
|
||||
greg_day(unsigned short day_of_month) : greg_day_rep(day_of_month) {}
|
||||
unsigned short as_number() const {return value_;}
|
||||
operator unsigned short() const {return value_;}
|
||||
BOOST_CXX14_CONSTEXPR greg_day(value_type day_of_month) : greg_day_rep(day_of_month) {}
|
||||
BOOST_CXX14_CONSTEXPR value_type as_number() const {return value_;}
|
||||
BOOST_CXX14_CONSTEXPR operator value_type() const {return value_;}
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include "boost/date_time/constrained_value.hpp"
|
||||
#include <boost/date_time/constrained_value.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
|
||||
@@ -17,7 +18,7 @@ namespace boost {
|
||||
namespace gregorian {
|
||||
|
||||
//! Exception type for day of year (1..366)
|
||||
struct bad_day_of_year : public std::out_of_range
|
||||
struct BOOST_SYMBOL_VISIBLE bad_day_of_year : public std::out_of_range
|
||||
{
|
||||
bad_day_of_year() :
|
||||
std::out_of_range(std::string("Day of year value is out of range 1..366"))
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef GREG_DURATION_HPP___
|
||||
#define GREG_DURATION_HPP___
|
||||
|
||||
/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
|
||||
/* Copyright (c) 2002,2003, 2020 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
@@ -9,6 +9,7 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/date_duration.hpp>
|
||||
#include <boost/date_time/int_adapter.hpp>
|
||||
#include <boost/date_time/special_defs.hpp>
|
||||
@@ -22,7 +23,7 @@ namespace gregorian {
|
||||
//! Durations in days for gregorian system
|
||||
/*! \ingroup date_basics
|
||||
*/
|
||||
class date_duration :
|
||||
class BOOST_SYMBOL_VISIBLE date_duration :
|
||||
public boost::date_time::date_duration< date_duration_rep >
|
||||
{
|
||||
typedef boost::date_time::date_duration< date_duration_rep > base_type;
|
||||
@@ -31,16 +32,15 @@ namespace gregorian {
|
||||
typedef base_type::duration_rep duration_rep;
|
||||
|
||||
//! Construct from a day count
|
||||
explicit date_duration(duration_rep day_count = 0) : base_type(day_count) {}
|
||||
BOOST_CXX14_CONSTEXPR explicit
|
||||
date_duration(duration_rep day_count = 0) : base_type(day_count) {}
|
||||
|
||||
//! construct from special_values
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
date_duration(date_time::special_values sv) : base_type(sv) {}
|
||||
|
||||
//! Copy constructor
|
||||
date_duration(const date_duration& other) : base_type(static_cast< base_type const& >(other))
|
||||
{}
|
||||
|
||||
//! Construct from another date_duration
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
date_duration(const base_type& other) : base_type(other)
|
||||
{}
|
||||
|
||||
@@ -48,80 +48,93 @@ namespace gregorian {
|
||||
// NOTE: Because of date_time::date_duration< T > design choice we don't use Boost.Operators here,
|
||||
// because we need the class to be a direct base. Either lose EBO, or define operators by hand.
|
||||
// The latter is more effecient.
|
||||
bool operator== (const date_duration& rhs) const
|
||||
BOOST_CXX14_CONSTEXPR bool operator== (const date_duration& rhs) const
|
||||
{
|
||||
return base_type::operator== (rhs);
|
||||
}
|
||||
bool operator!= (const date_duration& rhs) const
|
||||
BOOST_CXX14_CONSTEXPR bool operator!= (const date_duration& rhs) const
|
||||
{
|
||||
return !operator== (rhs);
|
||||
}
|
||||
bool operator< (const date_duration& rhs) const
|
||||
BOOST_CXX14_CONSTEXPR bool operator< (const date_duration& rhs) const
|
||||
{
|
||||
return base_type::operator< (rhs);
|
||||
}
|
||||
bool operator> (const date_duration& rhs) const
|
||||
BOOST_CXX14_CONSTEXPR bool operator> (const date_duration& rhs) const
|
||||
{
|
||||
return !(base_type::operator< (rhs) || base_type::operator== (rhs));
|
||||
}
|
||||
bool operator<= (const date_duration& rhs) const
|
||||
BOOST_CXX14_CONSTEXPR bool operator<= (const date_duration& rhs) const
|
||||
{
|
||||
return (base_type::operator< (rhs) || base_type::operator== (rhs));
|
||||
}
|
||||
bool operator>= (const date_duration& rhs) const
|
||||
BOOST_CXX14_CONSTEXPR bool operator>= (const date_duration& rhs) const
|
||||
{
|
||||
return !base_type::operator< (rhs);
|
||||
}
|
||||
|
||||
//! Subtract another duration -- result is signed
|
||||
date_duration& operator-= (const date_duration& rhs)
|
||||
BOOST_CXX14_CONSTEXPR date_duration& operator-= (const date_duration& rhs)
|
||||
{
|
||||
base_type::operator-= (rhs);
|
||||
return *this;
|
||||
}
|
||||
friend date_duration operator- (date_duration rhs, date_duration const& lhs)
|
||||
{
|
||||
rhs -= lhs;
|
||||
return rhs;
|
||||
}
|
||||
|
||||
BOOST_CXX14_CONSTEXPR friend
|
||||
date_duration operator- (date_duration rhs, date_duration const& lhs);
|
||||
|
||||
//! Add a duration -- result is signed
|
||||
date_duration& operator+= (const date_duration& rhs)
|
||||
BOOST_CXX14_CONSTEXPR date_duration& operator+= (const date_duration& rhs)
|
||||
{
|
||||
base_type::operator+= (rhs);
|
||||
return *this;
|
||||
}
|
||||
friend date_duration operator+ (date_duration rhs, date_duration const& lhs)
|
||||
{
|
||||
rhs += lhs;
|
||||
return rhs;
|
||||
}
|
||||
|
||||
BOOST_CXX14_CONSTEXPR friend
|
||||
date_duration operator+ (date_duration rhs, date_duration const& lhs);
|
||||
|
||||
//! unary- Allows for dd = -date_duration(2); -> dd == -2
|
||||
date_duration operator- ()const
|
||||
BOOST_CXX14_CONSTEXPR date_duration operator- ()const
|
||||
{
|
||||
return date_duration(get_rep() * (-1));
|
||||
}
|
||||
|
||||
//! Division operations on a duration with an integer.
|
||||
date_duration& operator/= (int divisor)
|
||||
BOOST_CXX14_CONSTEXPR date_duration& operator/= (int divisor)
|
||||
{
|
||||
base_type::operator/= (divisor);
|
||||
return *this;
|
||||
}
|
||||
friend date_duration operator/ (date_duration rhs, int lhs)
|
||||
{
|
||||
rhs /= lhs;
|
||||
return rhs;
|
||||
}
|
||||
|
||||
BOOST_CXX14_CONSTEXPR friend date_duration operator/ (date_duration rhs, int lhs);
|
||||
|
||||
//! Returns the smallest duration -- used by to calculate 'end'
|
||||
static date_duration unit()
|
||||
static BOOST_CXX14_CONSTEXPR date_duration unit()
|
||||
{
|
||||
return date_duration(base_type::unit().get_rep());
|
||||
}
|
||||
};
|
||||
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
date_duration operator- (date_duration rhs, date_duration const& lhs)
|
||||
{
|
||||
rhs -= lhs;
|
||||
return rhs;
|
||||
}
|
||||
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
date_duration operator+ (date_duration rhs, date_duration const& lhs)
|
||||
{
|
||||
rhs += lhs;
|
||||
return rhs;
|
||||
}
|
||||
|
||||
inline BOOST_CXX14_CONSTEXPR date_duration operator/ (date_duration rhs, int lhs)
|
||||
{
|
||||
rhs /= lhs;
|
||||
return rhs;
|
||||
}
|
||||
|
||||
//! Shorthand for date_duration
|
||||
typedef date_duration days;
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#ifndef GREG_DURATION_TYPES_HPP___
|
||||
#define GREG_DURATION_TYPES_HPP___
|
||||
|
||||
|
||||
/* Copyright (c) 2004 CrystalClear Software, Inc.
|
||||
* Subject to Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
@@ -9,6 +9,7 @@
|
||||
*/
|
||||
|
||||
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/gregorian/greg_date.hpp>
|
||||
#include <boost/date_time/int_adapter.hpp>
|
||||
#include <boost/date_time/adjust_functors.hpp>
|
||||
@@ -19,7 +20,7 @@ namespace boost {
|
||||
namespace gregorian {
|
||||
|
||||
//! config struct for additional duration types (ie months_duration<> & years_duration<>)
|
||||
struct greg_durations_config {
|
||||
struct BOOST_SYMBOL_VISIBLE greg_durations_config {
|
||||
typedef date date_type;
|
||||
typedef date_time::int_adapter<int> int_rep;
|
||||
typedef date_time::month_functor<date_type> month_adjustor_type;
|
||||
@@ -28,11 +29,11 @@ namespace gregorian {
|
||||
typedef date_time::months_duration<greg_durations_config> months;
|
||||
typedef date_time::years_duration<greg_durations_config> years;
|
||||
|
||||
class weeks_duration : public date_duration {
|
||||
class BOOST_SYMBOL_VISIBLE weeks_duration : public date_duration {
|
||||
public:
|
||||
weeks_duration(duration_rep w)
|
||||
BOOST_CXX14_CONSTEXPR weeks_duration(duration_rep w)
|
||||
: date_duration(w * 7) {}
|
||||
weeks_duration(date_time::special_values sv)
|
||||
BOOST_CXX14_CONSTEXPR weeks_duration(date_time::special_values sv)
|
||||
: date_duration(sv) {}
|
||||
};
|
||||
|
||||
|
||||
@@ -9,9 +9,11 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include "boost/date_time/gregorian/gregorian_types.hpp"
|
||||
#include "boost/date_time/date_formatting_locales.hpp" // sets BOOST_DATE_TIME_NO_LOCALE
|
||||
#include "boost/date_time/gregorian/parsers.hpp"
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/gregorian/gregorian_types.hpp>
|
||||
#include <boost/date_time/date_formatting_locales.hpp> // sets BOOST_DATE_TIME_NO_LOCALE
|
||||
#include <boost/date_time/gregorian/parsers.hpp>
|
||||
#include <boost/io/ios_state.hpp>
|
||||
|
||||
//This file is basically commented out if locales are not supported
|
||||
#ifndef BOOST_DATE_TIME_NO_LOCALE
|
||||
@@ -26,7 +28,7 @@ namespace boost {
|
||||
namespace gregorian {
|
||||
|
||||
//! Configuration of the output facet template
|
||||
struct greg_facet_config
|
||||
struct BOOST_SYMBOL_VISIBLE greg_facet_config
|
||||
{
|
||||
typedef boost::gregorian::greg_month month_type;
|
||||
typedef boost::date_time::special_values special_value_enum;
|
||||
@@ -74,9 +76,9 @@ namespace gregorian {
|
||||
greg_month_formatter::format_month(m, os, f);
|
||||
|
||||
}
|
||||
else { //default to numeric
|
||||
charT fill_char = '0';
|
||||
os << std::setw(2) << std::setfill(fill_char) << m.as_number();
|
||||
else { // default to numeric
|
||||
boost::io::basic_ios_fill_saver<charT> ifs(os);
|
||||
os << std::setw(2) << std::setfill(os.widen('0')) << m.as_number();
|
||||
}
|
||||
|
||||
return os;
|
||||
@@ -97,7 +99,7 @@ namespace gregorian {
|
||||
std::locale locale = os.getloc();
|
||||
if (std::has_facet<facet_def>(locale)) {
|
||||
const facet_def& f = std::use_facet<facet_def>(locale);
|
||||
greg_weekday_formatter::format_weekday(wd.as_enum(), os, f, true);
|
||||
greg_weekday_formatter::format_weekday(wd, os, f, true);
|
||||
}
|
||||
else { //default to short English string eg: Sun, Mon, Tue, Wed...
|
||||
os << wd.as_short_string();
|
||||
@@ -141,7 +143,8 @@ namespace gregorian {
|
||||
std::basic_ostream<charT, traits>&
|
||||
operator<<(std::basic_ostream<charT, traits>& os, const partial_date& pd)
|
||||
{
|
||||
os << std::setw(2) << std::setfill('0') << pd.day() << ' '
|
||||
boost::io::basic_ios_fill_saver<charT> ifs(os);
|
||||
os << std::setw(2) << std::setfill(os.widen('0')) << pd.day() << ' '
|
||||
<< pd.month().as_short_string() ;
|
||||
return os;
|
||||
}
|
||||
@@ -214,8 +217,6 @@ namespace gregorian {
|
||||
std::basic_istream<charT>& operator>>(std::basic_istream<charT>& is, date& d)
|
||||
{
|
||||
std::istream_iterator<std::basic_string<charT>, charT> beg(is), eos;
|
||||
|
||||
typedef boost::date_time::all_date_names_put<greg_facet_config, charT> facet_def;
|
||||
d = from_stream(beg, eos);
|
||||
return is;
|
||||
}
|
||||
@@ -292,7 +293,17 @@ namespace gregorian {
|
||||
* names as a default. */
|
||||
catch(std::bad_cast&){
|
||||
charT a = '\0';
|
||||
|
||||
#if defined(BOOST_NO_CXX11_SMART_PTR)
|
||||
|
||||
std::auto_ptr< const facet_def > f(create_facet_def(a));
|
||||
|
||||
#else
|
||||
|
||||
std::unique_ptr< const facet_def > f(create_facet_def(a));
|
||||
|
||||
#endif
|
||||
|
||||
num = date_time::find_match(f->get_short_month_names(),
|
||||
f->get_long_month_names(),
|
||||
(greg_month::max)(), s); // greg_month spans 1..12, so max returns the array size,
|
||||
@@ -334,7 +345,17 @@ namespace gregorian {
|
||||
* names as a default. */
|
||||
catch(std::bad_cast&){
|
||||
charT a = '\0';
|
||||
|
||||
#if defined(BOOST_NO_CXX11_SMART_PTR)
|
||||
|
||||
std::auto_ptr< const facet_def > f(create_facet_def(a));
|
||||
|
||||
#else
|
||||
|
||||
std::unique_ptr< const facet_def > f(create_facet_def(a));
|
||||
|
||||
#endif
|
||||
|
||||
num = date_time::find_match(f->get_short_weekday_names(),
|
||||
f->get_long_weekday_names(),
|
||||
(greg_weekday::max)() + 1, s); // greg_weekday spans 0..6, so increment is needed
|
||||
@@ -347,8 +368,7 @@ namespace gregorian {
|
||||
|
||||
} } //namespace gregorian
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef GREG_MONTH_HPP___
|
||||
#define GREG_MONTH_HPP___
|
||||
|
||||
/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
|
||||
/* Copyright (c) 2002,2003, 2020 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
@@ -9,15 +9,11 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include "boost/date_time/constrained_value.hpp"
|
||||
#include "boost/date_time/date_defs.hpp"
|
||||
#include "boost/shared_ptr.hpp"
|
||||
#include "boost/date_time/compiler_config.hpp"
|
||||
#include <boost/date_time/constrained_value.hpp>
|
||||
#include <boost/date_time/date_defs.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <algorithm>
|
||||
#include <cctype>
|
||||
|
||||
namespace boost {
|
||||
namespace gregorian {
|
||||
@@ -39,9 +35,9 @@ namespace gregorian {
|
||||
using date_time::Dec;
|
||||
using date_time::NotAMonth;
|
||||
using date_time::NumMonths;
|
||||
|
||||
|
||||
//! Exception thrown if a greg_month is constructed with a value out of range
|
||||
struct bad_month : public std::out_of_range
|
||||
struct BOOST_SYMBOL_VISIBLE bad_month : public std::out_of_range
|
||||
{
|
||||
bad_month() : std::out_of_range(std::string("Month number is out of range 1..12")) {}
|
||||
};
|
||||
@@ -50,31 +46,65 @@ namespace gregorian {
|
||||
//! A constrained range that implements the gregorian_month rules
|
||||
typedef CV::constrained_value<greg_month_policies> greg_month_rep;
|
||||
|
||||
|
||||
|
||||
//! Wrapper class to represent months in gregorian based calendar
|
||||
class BOOST_DATE_TIME_DECL greg_month : public greg_month_rep {
|
||||
class BOOST_SYMBOL_VISIBLE greg_month : public greg_month_rep {
|
||||
public:
|
||||
typedef date_time::months_of_year month_enum;
|
||||
typedef std::map<std::string, unsigned short> month_map_type;
|
||||
typedef boost::shared_ptr<month_map_type> month_map_ptr_type;
|
||||
|
||||
//! Construct a month from the months_of_year enumeration
|
||||
greg_month(month_enum theMonth) :
|
||||
BOOST_CXX14_CONSTEXPR greg_month(month_enum theMonth) :
|
||||
greg_month_rep(static_cast<greg_month_rep::value_type>(theMonth)) {}
|
||||
//! Construct from a short value
|
||||
greg_month(unsigned short theMonth) : greg_month_rep(theMonth) {}
|
||||
BOOST_CXX14_CONSTEXPR greg_month(value_type theMonth) : greg_month_rep(theMonth) {}
|
||||
//! Convert the value back to a short
|
||||
operator unsigned short() const {return value_;}
|
||||
BOOST_CXX14_CONSTEXPR operator value_type() const {return value_;}
|
||||
//! Returns month as number from 1 to 12
|
||||
unsigned short as_number() const {return value_;}
|
||||
month_enum as_enum() const {return static_cast<month_enum>(value_);}
|
||||
const char* as_short_string() const;
|
||||
const char* as_long_string() const;
|
||||
BOOST_CXX14_CONSTEXPR value_type as_number() const {return value_;}
|
||||
BOOST_CXX14_CONSTEXPR month_enum as_enum() const {return static_cast<month_enum>(value_);}
|
||||
|
||||
//! Returns 3 char english string for the month ex: Jan, Feb, Mar, Apr
|
||||
const char*
|
||||
as_short_string() const
|
||||
{
|
||||
static const char* const short_month_names[NumMonths]
|
||||
= {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec", "NAM"};
|
||||
return short_month_names[value_-1];
|
||||
}
|
||||
|
||||
//! Returns full name of month as string in english ex: January, February
|
||||
const char*
|
||||
as_long_string() const
|
||||
{
|
||||
static const char* const long_month_names[NumMonths]
|
||||
= {"January","February","March","April","May","June","July","August",
|
||||
"September","October","November","December","NotAMonth"};
|
||||
return long_month_names[value_-1];
|
||||
}
|
||||
|
||||
#ifndef BOOST_NO_STD_WSTRING
|
||||
const wchar_t* as_short_wstring() const;
|
||||
const wchar_t* as_long_wstring() const;
|
||||
|
||||
//! Returns 3 wchar_t english string for the month ex: Jan, Feb, Mar, Apr
|
||||
const wchar_t*
|
||||
as_short_wstring() const
|
||||
{
|
||||
static const wchar_t* const w_short_month_names[NumMonths]
|
||||
= {L"Jan",L"Feb",L"Mar",L"Apr",L"May",L"Jun",L"Jul",L"Aug",L"Sep",L"Oct",
|
||||
L"Nov",L"Dec",L"NAM"};
|
||||
return w_short_month_names[value_-1];
|
||||
}
|
||||
|
||||
//! Returns full name of month as wchar_t string in english ex: January, February
|
||||
const wchar_t*
|
||||
as_long_wstring() const
|
||||
{
|
||||
static const wchar_t* const w_long_month_names[NumMonths]
|
||||
= {L"January",L"February",L"March",L"April",L"May",L"June",L"July",L"August",
|
||||
L"September",L"October",L"November",L"December",L"NotAMonth"};
|
||||
return w_long_month_names[value_-1];
|
||||
}
|
||||
|
||||
#endif // BOOST_NO_STD_WSTRING
|
||||
//! Shared pointer to a map of Month strings (Names & Abbrev) & numbers
|
||||
static month_map_ptr_type get_month_map_ptr();
|
||||
|
||||
/* parameterized as_*_string functions are intended to be called
|
||||
* from a template function: "... as_short_string(charT c='\0');" */
|
||||
@@ -100,6 +130,4 @@ namespace gregorian {
|
||||
|
||||
} } //namespace gregorian
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -11,38 +11,47 @@
|
||||
|
||||
#include "boost/date_time/gregorian/gregorian_types.hpp"
|
||||
#include "boost/date_time/gregorian/parsers.hpp"
|
||||
#include "boost/serialization/split_free.hpp"
|
||||
#include "boost/core/nvp.hpp"
|
||||
|
||||
|
||||
// macros to split serialize functions into save & load functions
|
||||
// An expanded version is below for gregorian::date
|
||||
// NOTE: these macros define template functions in the boost::serialization namespace.
|
||||
// They must be expanded *outside* of any namespace
|
||||
BOOST_SERIALIZATION_SPLIT_FREE(::boost::gregorian::date_duration)
|
||||
BOOST_SERIALIZATION_SPLIT_FREE(::boost::gregorian::date_duration::duration_rep)
|
||||
BOOST_SERIALIZATION_SPLIT_FREE(::boost::gregorian::date_period)
|
||||
BOOST_SERIALIZATION_SPLIT_FREE(::boost::gregorian::greg_month)
|
||||
BOOST_SERIALIZATION_SPLIT_FREE(::boost::gregorian::greg_day)
|
||||
BOOST_SERIALIZATION_SPLIT_FREE(::boost::gregorian::greg_weekday)
|
||||
BOOST_SERIALIZATION_SPLIT_FREE(::boost::gregorian::partial_date)
|
||||
BOOST_SERIALIZATION_SPLIT_FREE(::boost::gregorian::nth_kday_of_month)
|
||||
BOOST_SERIALIZATION_SPLIT_FREE(::boost::gregorian::first_kday_of_month)
|
||||
BOOST_SERIALIZATION_SPLIT_FREE(::boost::gregorian::last_kday_of_month)
|
||||
BOOST_SERIALIZATION_SPLIT_FREE(::boost::gregorian::first_kday_before)
|
||||
BOOST_SERIALIZATION_SPLIT_FREE(::boost::gregorian::first_kday_after)
|
||||
|
||||
namespace boost {
|
||||
|
||||
namespace gregorian {
|
||||
std::string to_iso_string(const date&);
|
||||
}
|
||||
|
||||
namespace serialization {
|
||||
|
||||
// A macro to split serialize functions into save & load functions.
|
||||
// It is here to avoid dependency on Boost.Serialization just for the
|
||||
// BOOST_SERIALIZATION_SPLIT_FREE macro
|
||||
#define BOOST_DATE_TIME_SPLIT_FREE(T) \
|
||||
template<class Archive> \
|
||||
inline void serialize(Archive & ar, \
|
||||
T & t, \
|
||||
const unsigned int file_version) \
|
||||
{ \
|
||||
split_free(ar, t, file_version); \
|
||||
}
|
||||
|
||||
/*! Method that does serialization for gregorian::date -- splits to load/save
|
||||
*/
|
||||
template<class Archive>
|
||||
inline void serialize(Archive & ar,
|
||||
::boost::gregorian::date & d,
|
||||
const unsigned int file_version)
|
||||
{
|
||||
split_free(ar, d, file_version);
|
||||
}
|
||||
BOOST_DATE_TIME_SPLIT_FREE(::boost::gregorian::date)
|
||||
BOOST_DATE_TIME_SPLIT_FREE(::boost::gregorian::date_duration)
|
||||
BOOST_DATE_TIME_SPLIT_FREE(::boost::gregorian::date_duration::duration_rep)
|
||||
BOOST_DATE_TIME_SPLIT_FREE(::boost::gregorian::date_period)
|
||||
BOOST_DATE_TIME_SPLIT_FREE(::boost::gregorian::greg_year)
|
||||
BOOST_DATE_TIME_SPLIT_FREE(::boost::gregorian::greg_month)
|
||||
BOOST_DATE_TIME_SPLIT_FREE(::boost::gregorian::greg_day)
|
||||
BOOST_DATE_TIME_SPLIT_FREE(::boost::gregorian::greg_weekday)
|
||||
BOOST_DATE_TIME_SPLIT_FREE(::boost::gregorian::partial_date)
|
||||
BOOST_DATE_TIME_SPLIT_FREE(::boost::gregorian::nth_kday_of_month)
|
||||
BOOST_DATE_TIME_SPLIT_FREE(::boost::gregorian::first_kday_of_month)
|
||||
BOOST_DATE_TIME_SPLIT_FREE(::boost::gregorian::last_kday_of_month)
|
||||
BOOST_DATE_TIME_SPLIT_FREE(::boost::gregorian::first_kday_before)
|
||||
BOOST_DATE_TIME_SPLIT_FREE(::boost::gregorian::first_kday_after)
|
||||
|
||||
#undef BOOST_DATE_TIME_SPLIT_FREE
|
||||
|
||||
//! Function to save gregorian::date objects using serialization lib
|
||||
/*! Dates are serialized into a string for transport and storage.
|
||||
@@ -86,7 +95,7 @@ void load(Archive & ar,
|
||||
|
||||
//!override needed b/c no default constructor
|
||||
template<class Archive>
|
||||
inline void load_construct_data(Archive & ar,
|
||||
inline void load_construct_data(Archive & /*ar*/,
|
||||
::boost::gregorian::date* dp,
|
||||
const unsigned int /*file_version*/)
|
||||
{
|
||||
@@ -115,7 +124,7 @@ void load(Archive & ar, gregorian::date_duration & dd, unsigned int /*version*/)
|
||||
}
|
||||
//!override needed b/c no default constructor
|
||||
template<class Archive>
|
||||
inline void load_construct_data(Archive & ar, gregorian::date_duration* dd,
|
||||
inline void load_construct_data(Archive & /*ar*/, gregorian::date_duration* dd,
|
||||
const unsigned int /*file_version*/)
|
||||
{
|
||||
::new(dd) gregorian::date_duration(gregorian::not_a_date_time);
|
||||
@@ -141,7 +150,7 @@ void load(Archive & ar, gregorian::date_duration::duration_rep & dr, unsigned in
|
||||
}
|
||||
//!override needed b/c no default constructor
|
||||
template<class Archive>
|
||||
inline void load_construct_data(Archive & ar, gregorian::date_duration::duration_rep* dr,
|
||||
inline void load_construct_data(Archive & /*ar*/, gregorian::date_duration::duration_rep* dr,
|
||||
const unsigned int /*file_version*/)
|
||||
{
|
||||
::new(dr) gregorian::date_duration::duration_rep(0);
|
||||
@@ -177,7 +186,7 @@ void load(Archive & ar, gregorian::date_period& dp, unsigned int /*version*/)
|
||||
}
|
||||
//!override needed b/c no default constructor
|
||||
template<class Archive>
|
||||
inline void load_construct_data(Archive & ar, gregorian::date_period* dp,
|
||||
inline void load_construct_data(Archive & /*ar*/, gregorian::date_period* dp,
|
||||
const unsigned int /*file_version*/)
|
||||
{
|
||||
gregorian::date d(gregorian::not_a_date_time);
|
||||
@@ -185,6 +194,32 @@ inline void load_construct_data(Archive & ar, gregorian::date_period* dp,
|
||||
::new(dp) gregorian::date_period(d,dd);
|
||||
}
|
||||
|
||||
/**** greg_year ****/
|
||||
|
||||
//! Function to save gregorian::greg_year objects using serialization lib
|
||||
template<class Archive>
|
||||
void save(Archive & ar, const gregorian::greg_year& gy,
|
||||
unsigned int /*version*/)
|
||||
{
|
||||
unsigned short us = gy;
|
||||
ar & make_nvp("greg_year", us);
|
||||
}
|
||||
//! Function to load gregorian::greg_year objects using serialization lib
|
||||
template<class Archive>
|
||||
void load(Archive & ar, gregorian::greg_year& gy, unsigned int /*version*/)
|
||||
{
|
||||
unsigned short us;
|
||||
ar & make_nvp("greg_year", us);
|
||||
gy = gregorian::greg_year(us);
|
||||
}
|
||||
//!override needed b/c no default constructor
|
||||
template<class Archive>
|
||||
inline void load_construct_data(Archive & /*ar*/, gregorian::greg_year* gy,
|
||||
const unsigned int /*file_version*/)
|
||||
{
|
||||
::new(gy) gregorian::greg_year(1900);
|
||||
}
|
||||
|
||||
/**** greg_month ****/
|
||||
|
||||
//! Function to save gregorian::greg_month objects using serialization lib
|
||||
@@ -205,7 +240,7 @@ void load(Archive & ar, gregorian::greg_month& gm, unsigned int /*version*/)
|
||||
}
|
||||
//!override needed b/c no default constructor
|
||||
template<class Archive>
|
||||
inline void load_construct_data(Archive & ar, gregorian::greg_month* gm,
|
||||
inline void load_construct_data(Archive & /*ar*/, gregorian::greg_month* gm,
|
||||
const unsigned int /*file_version*/)
|
||||
{
|
||||
::new(gm) gregorian::greg_month(1);
|
||||
@@ -231,7 +266,7 @@ void load(Archive & ar, gregorian::greg_day& gd, unsigned int /*version*/)
|
||||
}
|
||||
//!override needed b/c no default constructor
|
||||
template<class Archive>
|
||||
inline void load_construct_data(Archive & ar, gregorian::greg_day* gd,
|
||||
inline void load_construct_data(Archive & /*ar*/, gregorian::greg_day* gd,
|
||||
const unsigned int /*file_version*/)
|
||||
{
|
||||
::new(gd) gregorian::greg_day(1);
|
||||
@@ -257,7 +292,7 @@ void load(Archive & ar, gregorian::greg_weekday& gd, unsigned int /*version*/)
|
||||
}
|
||||
//!override needed b/c no default constructor
|
||||
template<class Archive>
|
||||
inline void load_construct_data(Archive & ar, gregorian::greg_weekday* gd,
|
||||
inline void load_construct_data(Archive & /*ar*/, gregorian::greg_weekday* gd,
|
||||
const unsigned int /*file_version*/)
|
||||
{
|
||||
::new(gd) gregorian::greg_weekday(1);
|
||||
@@ -295,7 +330,7 @@ void load(Archive & ar, gregorian::partial_date& pd, unsigned int /*version*/)
|
||||
}
|
||||
//!override needed b/c no default constructor
|
||||
template<class Archive>
|
||||
inline void load_construct_data(Archive & ar, gregorian::partial_date* pd,
|
||||
inline void load_construct_data(Archive & /*ar*/, gregorian::partial_date* pd,
|
||||
const unsigned int /*file_version*/)
|
||||
{
|
||||
gregorian::greg_month gm(1);
|
||||
@@ -338,7 +373,7 @@ void load(Archive & ar, gregorian::nth_kday_of_month& nkd, unsigned int /*versio
|
||||
}
|
||||
//!override needed b/c no default constructor
|
||||
template<class Archive>
|
||||
inline void load_construct_data(Archive & ar,
|
||||
inline void load_construct_data(Archive & /*ar*/,
|
||||
gregorian::nth_kday_of_month* nkd,
|
||||
const unsigned int /*file_version*/)
|
||||
{
|
||||
@@ -378,7 +413,7 @@ void load(Archive & ar, gregorian::first_kday_of_month& fkd, unsigned int /*vers
|
||||
}
|
||||
//!override needed b/c no default constructor
|
||||
template<class Archive>
|
||||
inline void load_construct_data(Archive & ar,
|
||||
inline void load_construct_data(Archive & /*ar*/,
|
||||
gregorian::first_kday_of_month* fkd,
|
||||
const unsigned int /*file_version*/)
|
||||
{
|
||||
@@ -417,7 +452,7 @@ void load(Archive & ar, gregorian::last_kday_of_month& lkd, unsigned int /*versi
|
||||
}
|
||||
//!override needed b/c no default constructor
|
||||
template<class Archive>
|
||||
inline void load_construct_data(Archive & ar,
|
||||
inline void load_construct_data(Archive & /*ar*/,
|
||||
gregorian::last_kday_of_month* lkd,
|
||||
const unsigned int /*file_version*/)
|
||||
{
|
||||
@@ -446,7 +481,7 @@ void load(Archive & ar, gregorian::first_kday_before& fkdb, unsigned int /*versi
|
||||
}
|
||||
//!override needed b/c no default constructor
|
||||
template<class Archive>
|
||||
inline void load_construct_data(Archive & ar,
|
||||
inline void load_construct_data(Archive & /*ar*/,
|
||||
gregorian::first_kday_before* fkdb,
|
||||
const unsigned int /*file_version*/)
|
||||
{
|
||||
@@ -475,7 +510,7 @@ void load(Archive & ar, gregorian::first_kday_after& fkda, unsigned int /*versio
|
||||
}
|
||||
//!override needed b/c no default constructor
|
||||
template<class Archive>
|
||||
inline void load_construct_data(Archive & ar,
|
||||
inline void load_construct_data(Archive & /*ar*/,
|
||||
gregorian::first_kday_after* fkda,
|
||||
const unsigned int /*file_version*/)
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef GREG_WEEKDAY_HPP___
|
||||
#define GREG_WEEKDAY_HPP___
|
||||
|
||||
/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
|
||||
/* Copyright (c) 2002,2003,2020 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
@@ -9,9 +9,9 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include "boost/date_time/constrained_value.hpp"
|
||||
#include "boost/date_time/date_defs.hpp"
|
||||
#include "boost/date_time/compiler_config.hpp"
|
||||
#include <boost/date_time/constrained_value.hpp>
|
||||
#include <boost/date_time/date_defs.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
|
||||
@@ -29,7 +29,7 @@ namespace gregorian {
|
||||
|
||||
|
||||
//! Exception that flags that a weekday number is incorrect
|
||||
struct bad_weekday : public std::out_of_range
|
||||
struct BOOST_SYMBOL_VISIBLE bad_weekday : public std::out_of_range
|
||||
{
|
||||
bad_weekday() : std::out_of_range(std::string("Weekday is out of range 0..6")) {}
|
||||
};
|
||||
@@ -38,21 +38,55 @@ namespace gregorian {
|
||||
|
||||
|
||||
//! Represent a day within a week (range 0==Sun to 6==Sat)
|
||||
class BOOST_DATE_TIME_DECL greg_weekday : public greg_weekday_rep {
|
||||
class BOOST_SYMBOL_VISIBLE greg_weekday : public greg_weekday_rep {
|
||||
public:
|
||||
typedef boost::date_time::weekdays weekday_enum;
|
||||
greg_weekday(unsigned short day_of_week_num) :
|
||||
BOOST_CXX14_CONSTEXPR greg_weekday(value_type day_of_week_num) :
|
||||
greg_weekday_rep(day_of_week_num)
|
||||
{}
|
||||
|
||||
unsigned short as_number() const {return value_;}
|
||||
const char* as_short_string() const;
|
||||
const char* as_long_string() const;
|
||||
BOOST_CXX14_CONSTEXPR value_type as_number() const {return value_;}
|
||||
BOOST_CXX14_CONSTEXPR weekday_enum as_enum() const {return static_cast<weekday_enum>(value_);}
|
||||
|
||||
//! Return a 3 digit english string of the day of week (eg: Sun)
|
||||
const char* as_short_string() const
|
||||
{
|
||||
static const char* const short_weekday_names[]
|
||||
= {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
|
||||
|
||||
return short_weekday_names[value_];
|
||||
}
|
||||
|
||||
//! Return a point to a long english string representing day of week
|
||||
const char* as_long_string() const
|
||||
{
|
||||
static const char* const long_weekday_names[]
|
||||
= {"Sunday","Monday","Tuesday","Wednesday", "Thursday", "Friday", "Saturday"};
|
||||
|
||||
return long_weekday_names[value_];
|
||||
}
|
||||
|
||||
|
||||
#ifndef BOOST_NO_STD_WSTRING
|
||||
const wchar_t* as_short_wstring() const;
|
||||
const wchar_t* as_long_wstring() const;
|
||||
|
||||
//! Return a 3 digit english wchar_t string of the day of week (eg: Sun)
|
||||
const wchar_t* as_short_wstring() const
|
||||
{
|
||||
static const wchar_t* const w_short_weekday_names[]={L"Sun", L"Mon", L"Tue",
|
||||
L"Wed", L"Thu", L"Fri", L"Sat"};
|
||||
return w_short_weekday_names[value_];
|
||||
}
|
||||
|
||||
//! Return a point to a long english wchar_t string representing day of week
|
||||
const wchar_t* as_long_wstring() const
|
||||
{
|
||||
static const wchar_t* const w_long_weekday_names[]= {L"Sunday",L"Monday",L"Tuesday",
|
||||
L"Wednesday", L"Thursday",
|
||||
L"Friday", L"Saturday"};
|
||||
return w_long_weekday_names[value_];
|
||||
}
|
||||
|
||||
#endif // BOOST_NO_STD_WSTRING
|
||||
weekday_enum as_enum() const {return static_cast<weekday_enum>(value_);}
|
||||
|
||||
|
||||
};
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef GREG_YEAR_HPP___
|
||||
#define GREG_YEAR_HPP___
|
||||
|
||||
/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
|
||||
/* Copyright (c) 2002,2003, 2020 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
@@ -9,7 +9,8 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include "boost/date_time/constrained_value.hpp"
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/constrained_value.hpp>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
|
||||
@@ -17,31 +18,29 @@ namespace boost {
|
||||
namespace gregorian {
|
||||
|
||||
//! Exception type for gregorian year
|
||||
struct bad_year : public std::out_of_range
|
||||
struct BOOST_SYMBOL_VISIBLE bad_year : public std::out_of_range
|
||||
{
|
||||
bad_year() :
|
||||
std::out_of_range(std::string("Year is out of valid range: 1400..10000"))
|
||||
std::out_of_range(std::string("Year is out of valid range: 1400..9999"))
|
||||
{}
|
||||
};
|
||||
//! Policy class that declares error handling gregorian year type
|
||||
typedef CV::simple_exception_policy<unsigned short, 1400, 10000, bad_year> greg_year_policies;
|
||||
typedef CV::simple_exception_policy<unsigned short, 1400, 9999, bad_year> greg_year_policies;
|
||||
|
||||
//! Generated representation for gregorian year
|
||||
typedef CV::constrained_value<greg_year_policies> greg_year_rep;
|
||||
|
||||
//! Represent a day of the month (range 1900 - 10000)
|
||||
//! Represent a year (range 1400 - 9999)
|
||||
/*! This small class allows for simple conversion an integer value into
|
||||
a year for the gregorian calendar. This currently only allows a
|
||||
range of 1900 to 10000. Both ends of the range are a bit arbitrary
|
||||
range of 1400 to 9999. Both ends of the range are a bit arbitrary
|
||||
at the moment, but they are the limits of current testing of the
|
||||
library. As such they may be increased in the future.
|
||||
*/
|
||||
class greg_year : public greg_year_rep {
|
||||
class BOOST_SYMBOL_VISIBLE greg_year : public greg_year_rep {
|
||||
public:
|
||||
greg_year(unsigned short year) : greg_year_rep(year) {}
|
||||
operator unsigned short() const {return value_;}
|
||||
private:
|
||||
|
||||
BOOST_CXX14_CONSTEXPR greg_year(value_type year) : greg_year_rep(year) {}
|
||||
BOOST_CXX14_CONSTEXPR operator value_type() const {return value_;}
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -77,14 +77,14 @@ namespace gregorian {
|
||||
typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
|
||||
if (strm_sentry) {
|
||||
try {
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet;
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
|
||||
|
||||
std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
|
||||
if(std::has_facet<date_input_facet>(is.getloc())) {
|
||||
std::use_facet<date_input_facet>(is.getloc()).get(sit, str_end, is, d);
|
||||
if(std::has_facet<date_input_facet_local>(is.getloc())) {
|
||||
std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, d);
|
||||
}
|
||||
else {
|
||||
date_input_facet* f = new date_input_facet();
|
||||
date_input_facet_local* f = new date_input_facet_local();
|
||||
std::locale l = std::locale(is.getloc(), f);
|
||||
is.imbue(l);
|
||||
f->get(sit, str_end, is, d);
|
||||
@@ -138,14 +138,14 @@ namespace gregorian {
|
||||
typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
|
||||
if (strm_sentry) {
|
||||
try {
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet;
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
|
||||
|
||||
std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
|
||||
if(std::has_facet<date_input_facet>(is.getloc())) {
|
||||
std::use_facet<date_input_facet>(is.getloc()).get(sit, str_end, is, dd);
|
||||
if(std::has_facet<date_input_facet_local>(is.getloc())) {
|
||||
std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, dd);
|
||||
}
|
||||
else {
|
||||
date_input_facet* f = new date_input_facet();
|
||||
date_input_facet_local* f = new date_input_facet_local();
|
||||
std::locale l = std::locale(is.getloc(), f);
|
||||
is.imbue(l);
|
||||
f->get(sit, str_end, is, dd);
|
||||
@@ -202,14 +202,14 @@ namespace gregorian {
|
||||
typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
|
||||
if (strm_sentry) {
|
||||
try {
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet;
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
|
||||
|
||||
std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
|
||||
if(std::has_facet<date_input_facet>(is.getloc())) {
|
||||
std::use_facet<date_input_facet>(is.getloc()).get(sit, str_end, is, dp);
|
||||
if(std::has_facet<date_input_facet_local>(is.getloc())) {
|
||||
std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, dp);
|
||||
}
|
||||
else {
|
||||
date_input_facet* f = new date_input_facet();
|
||||
date_input_facet_local* f = new date_input_facet_local();
|
||||
std::locale l = std::locale(is.getloc(), f);
|
||||
is.imbue(l);
|
||||
f->get(sit, str_end, is, dp);
|
||||
@@ -261,14 +261,14 @@ namespace gregorian {
|
||||
typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
|
||||
if (strm_sentry) {
|
||||
try {
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet;
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
|
||||
|
||||
std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
|
||||
if(std::has_facet<date_input_facet>(is.getloc())) {
|
||||
std::use_facet<date_input_facet>(is.getloc()).get(sit, str_end, is, m);
|
||||
if(std::has_facet<date_input_facet_local>(is.getloc())) {
|
||||
std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, m);
|
||||
}
|
||||
else {
|
||||
date_input_facet* f = new date_input_facet();
|
||||
date_input_facet_local* f = new date_input_facet_local();
|
||||
std::locale l = std::locale(is.getloc(), f);
|
||||
is.imbue(l);
|
||||
f->get(sit, str_end, is, m);
|
||||
@@ -318,14 +318,14 @@ namespace gregorian {
|
||||
typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
|
||||
if (strm_sentry) {
|
||||
try {
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet;
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
|
||||
|
||||
std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
|
||||
if(std::has_facet<date_input_facet>(is.getloc())) {
|
||||
std::use_facet<date_input_facet>(is.getloc()).get(sit, str_end, is, wd);
|
||||
if(std::has_facet<date_input_facet_local>(is.getloc())) {
|
||||
std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, wd);
|
||||
}
|
||||
else {
|
||||
date_input_facet* f = new date_input_facet();
|
||||
date_input_facet_local* f = new date_input_facet_local();
|
||||
std::locale l = std::locale(is.getloc(), f);
|
||||
is.imbue(l);
|
||||
f->get(sit, str_end, is, wd);
|
||||
@@ -359,14 +359,14 @@ namespace gregorian {
|
||||
typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
|
||||
if (strm_sentry) {
|
||||
try {
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet;
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
|
||||
|
||||
std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
|
||||
if(std::has_facet<date_input_facet>(is.getloc())) {
|
||||
std::use_facet<date_input_facet>(is.getloc()).get(sit, str_end, is, gd);
|
||||
if(std::has_facet<date_input_facet_local>(is.getloc())) {
|
||||
std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, gd);
|
||||
}
|
||||
else {
|
||||
date_input_facet* f = new date_input_facet();
|
||||
date_input_facet_local* f = new date_input_facet_local();
|
||||
std::locale l = std::locale(is.getloc(), f);
|
||||
is.imbue(l);
|
||||
f->get(sit, str_end, is, gd);
|
||||
@@ -400,14 +400,14 @@ namespace gregorian {
|
||||
typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
|
||||
if (strm_sentry) {
|
||||
try {
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet;
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
|
||||
|
||||
std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
|
||||
if(std::has_facet<date_input_facet>(is.getloc())) {
|
||||
std::use_facet<date_input_facet>(is.getloc()).get(sit, str_end, is, gy);
|
||||
if(std::has_facet<date_input_facet_local>(is.getloc())) {
|
||||
std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, gy);
|
||||
}
|
||||
else {
|
||||
date_input_facet* f = new date_input_facet();
|
||||
date_input_facet_local* f = new date_input_facet_local();
|
||||
std::locale l = std::locale(is.getloc(), f);
|
||||
is.imbue(l);
|
||||
f->get(sit, str_end, is, gy);
|
||||
@@ -458,14 +458,14 @@ namespace gregorian {
|
||||
typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
|
||||
if (strm_sentry) {
|
||||
try {
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet;
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
|
||||
|
||||
std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
|
||||
if(std::has_facet<date_input_facet>(is.getloc())) {
|
||||
std::use_facet<date_input_facet>(is.getloc()).get(sit, str_end, is, pd);
|
||||
if(std::has_facet<date_input_facet_local>(is.getloc())) {
|
||||
std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, pd);
|
||||
}
|
||||
else {
|
||||
date_input_facet* f = new date_input_facet();
|
||||
date_input_facet_local* f = new date_input_facet_local();
|
||||
std::locale l = std::locale(is.getloc(), f);
|
||||
is.imbue(l);
|
||||
f->get(sit, str_end, is, pd);
|
||||
@@ -515,14 +515,14 @@ namespace gregorian {
|
||||
typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
|
||||
if (strm_sentry) {
|
||||
try {
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet;
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
|
||||
|
||||
std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
|
||||
if(std::has_facet<date_input_facet>(is.getloc())) {
|
||||
std::use_facet<date_input_facet>(is.getloc()).get(sit, str_end, is, nday);
|
||||
if(std::has_facet<date_input_facet_local>(is.getloc())) {
|
||||
std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, nday);
|
||||
}
|
||||
else {
|
||||
date_input_facet* f = new date_input_facet();
|
||||
date_input_facet_local* f = new date_input_facet_local();
|
||||
std::locale l = std::locale(is.getloc(), f);
|
||||
is.imbue(l);
|
||||
f->get(sit, str_end, is, nday);
|
||||
@@ -573,14 +573,14 @@ namespace gregorian {
|
||||
typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
|
||||
if (strm_sentry) {
|
||||
try {
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet;
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
|
||||
|
||||
std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
|
||||
if(std::has_facet<date_input_facet>(is.getloc())) {
|
||||
std::use_facet<date_input_facet>(is.getloc()).get(sit, str_end, is, fkd);
|
||||
if(std::has_facet<date_input_facet_local>(is.getloc())) {
|
||||
std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, fkd);
|
||||
}
|
||||
else {
|
||||
date_input_facet* f = new date_input_facet();
|
||||
date_input_facet_local* f = new date_input_facet_local();
|
||||
std::locale l = std::locale(is.getloc(), f);
|
||||
is.imbue(l);
|
||||
f->get(sit, str_end, is, fkd);
|
||||
@@ -631,14 +631,14 @@ namespace gregorian {
|
||||
typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
|
||||
if (strm_sentry) {
|
||||
try {
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet;
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
|
||||
|
||||
std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
|
||||
if(std::has_facet<date_input_facet>(is.getloc())) {
|
||||
std::use_facet<date_input_facet>(is.getloc()).get(sit, str_end, is, lkd);
|
||||
if(std::has_facet<date_input_facet_local>(is.getloc())) {
|
||||
std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, lkd);
|
||||
}
|
||||
else {
|
||||
date_input_facet* f = new date_input_facet();
|
||||
date_input_facet_local* f = new date_input_facet_local();
|
||||
std::locale l = std::locale(is.getloc(), f);
|
||||
is.imbue(l);
|
||||
f->get(sit, str_end, is, lkd);
|
||||
@@ -690,14 +690,14 @@ namespace gregorian {
|
||||
typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
|
||||
if (strm_sentry) {
|
||||
try {
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet;
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
|
||||
|
||||
std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
|
||||
if(std::has_facet<date_input_facet>(is.getloc())) {
|
||||
std::use_facet<date_input_facet>(is.getloc()).get(sit, str_end, is, fka);
|
||||
if(std::has_facet<date_input_facet_local>(is.getloc())) {
|
||||
std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, fka);
|
||||
}
|
||||
else {
|
||||
date_input_facet* f = new date_input_facet();
|
||||
date_input_facet_local* f = new date_input_facet_local();
|
||||
std::locale l = std::locale(is.getloc(), f);
|
||||
is.imbue(l);
|
||||
f->get(sit, str_end, is, fka);
|
||||
@@ -749,14 +749,14 @@ namespace gregorian {
|
||||
typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
|
||||
if (strm_sentry) {
|
||||
try {
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet;
|
||||
typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
|
||||
|
||||
std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
|
||||
if(std::has_facet<date_input_facet>(is.getloc())) {
|
||||
std::use_facet<date_input_facet>(is.getloc()).get(sit, str_end, is, fkb);
|
||||
if(std::has_facet<date_input_facet_local>(is.getloc())) {
|
||||
std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, fkb);
|
||||
}
|
||||
else {
|
||||
date_input_facet* f = new date_input_facet();
|
||||
date_input_facet_local* f = new date_input_facet_local();
|
||||
std::locale l = std::locale(is.getloc(), f);
|
||||
is.imbue(l);
|
||||
f->get(sit, str_end, is, fkb);
|
||||
|
||||
@@ -9,48 +9,67 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include "boost/date_time/gregorian/gregorian_types.hpp"
|
||||
#include "boost/date_time/date_parsing.hpp"
|
||||
#include "boost/date_time/compiler_config.hpp"
|
||||
#include "boost/date_time/parse_format_base.hpp"
|
||||
#include <boost/date_time/gregorian/gregorian_types.hpp>
|
||||
#include <boost/date_time/date_parsing.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/parse_format_base.hpp>
|
||||
#include <boost/date_time/special_defs.hpp>
|
||||
#include <boost/date_time/find_match.hpp>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <iterator>
|
||||
|
||||
namespace boost {
|
||||
namespace gregorian {
|
||||
|
||||
//! Return special_value from string argument
|
||||
/*! Return special_value from string argument. If argument is
|
||||
* not one of the special value names (defined in src/gregorian/names.hpp),
|
||||
/*! Return special_value from string argument. If argument is
|
||||
* not one of the special value names (defined in names.hpp),
|
||||
* return 'not_special' */
|
||||
BOOST_DATE_TIME_DECL special_values special_value_from_string(const std::string& s);
|
||||
inline
|
||||
date_time::special_values
|
||||
special_value_from_string(const std::string& s) {
|
||||
static const char* const special_value_names[date_time::NumSpecialValues]
|
||||
= {"not-a-date-time","-infinity","+infinity","min_date_time",
|
||||
"max_date_time","not_special"};
|
||||
|
||||
short i = date_time::find_match(special_value_names,
|
||||
special_value_names,
|
||||
date_time::NumSpecialValues,
|
||||
s);
|
||||
if(i >= date_time::NumSpecialValues) { // match not found
|
||||
return date_time::not_special;
|
||||
}
|
||||
else {
|
||||
return static_cast<date_time::special_values>(i);
|
||||
}
|
||||
}
|
||||
|
||||
//! Deprecated: Use from_simple_string
|
||||
inline date from_string(std::string s) {
|
||||
inline date from_string(const std::string& s) {
|
||||
return date_time::parse_date<date>(s);
|
||||
}
|
||||
|
||||
//! From delimited date string where with order year-month-day eg: 2002-1-25 or 2003-Jan-25 (full month name is also accepted)
|
||||
inline date from_simple_string(std::string s) {
|
||||
inline date from_simple_string(const std::string& s) {
|
||||
return date_time::parse_date<date>(s, date_time::ymd_order_iso);
|
||||
}
|
||||
|
||||
//! From delimited date string where with order year-month-day eg: 1-25-2003 or Jan-25-2003 (full month name is also accepted)
|
||||
inline date from_us_string(std::string s) {
|
||||
inline date from_us_string(const std::string& s) {
|
||||
return date_time::parse_date<date>(s, date_time::ymd_order_us);
|
||||
}
|
||||
|
||||
//! From delimited date string where with order day-month-year eg: 25-1-2002 or 25-Jan-2003 (full month name is also accepted)
|
||||
inline date from_uk_string(std::string s) {
|
||||
inline date from_uk_string(const std::string& s) {
|
||||
return date_time::parse_date<date>(s, date_time::ymd_order_dmy);
|
||||
}
|
||||
|
||||
//! From iso type date string where with order year-month-day eg: 20020125
|
||||
inline date from_undelimited_string(std::string s) {
|
||||
//! From ISO 8601 type date string where with order year-month-day eg: 20020125
|
||||
inline date from_undelimited_string(const std::string& s) {
|
||||
return date_time::parse_undelimited_date<date>(s);
|
||||
}
|
||||
|
||||
//! From iso type date string where with order year-month-day eg: 20020125
|
||||
//! From ISO 8601 type date string where with order year-month-day eg: 20020125
|
||||
inline date date_from_iso_string(const std::string& s) {
|
||||
return date_time::parse_undelimited_date<date>(s);
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace date_time {
|
||||
@@ -19,13 +20,13 @@ namespace date_time {
|
||||
can be used in the creation of date systems or just to perform calculations.
|
||||
All the methods of this class are static functions, so the intent is to
|
||||
never create instances of this class.
|
||||
@param ymd_type_ Struct type representing the year, month, day. The ymd_type must
|
||||
@tparam ymd_type_ Struct type representing the year, month, day. The ymd_type must
|
||||
define a of types for the year, month, and day. These types need to be
|
||||
arithmetic types.
|
||||
@param date_int_type_ Underlying type for the date count. Must be an arithmetic type.
|
||||
@tparam date_int_type_ Underlying type for the date count. Must be an arithmetic type.
|
||||
*/
|
||||
template<typename ymd_type_, typename date_int_type_>
|
||||
class gregorian_calendar_base {
|
||||
class BOOST_SYMBOL_VISIBLE gregorian_calendar_base {
|
||||
public:
|
||||
//! define a type a date split into components
|
||||
typedef ymd_type_ ymd_type;
|
||||
@@ -39,19 +40,18 @@ namespace date_time {
|
||||
typedef date_int_type_ date_int_type;
|
||||
|
||||
|
||||
static unsigned short day_of_week(const ymd_type& ymd);
|
||||
static int week_number(const ymd_type&ymd);
|
||||
//static unsigned short day_of_year(date_int_type);
|
||||
static date_int_type day_number(const ymd_type& ymd);
|
||||
static date_int_type julian_day_number(const ymd_type& ymd);
|
||||
static date_int_type modjulian_day_number(const ymd_type& ymd);
|
||||
static ymd_type from_day_number(date_int_type);
|
||||
static ymd_type from_julian_day_number(date_int_type);
|
||||
static ymd_type from_modjulian_day_number(date_int_type);
|
||||
static bool is_leap_year(year_type);
|
||||
static unsigned short end_of_month_day(year_type y, month_type m);
|
||||
static ymd_type epoch();
|
||||
static unsigned short days_in_week();
|
||||
static BOOST_CXX14_CONSTEXPR unsigned short day_of_week(const ymd_type& ymd);
|
||||
static BOOST_CXX14_CONSTEXPR int week_number(const ymd_type&ymd);
|
||||
static BOOST_CXX14_CONSTEXPR date_int_type day_number(const ymd_type& ymd);
|
||||
static BOOST_CXX14_CONSTEXPR date_int_type julian_day_number(const ymd_type& ymd);
|
||||
static BOOST_CXX14_CONSTEXPR date_int_type modjulian_day_number(const ymd_type& ymd);
|
||||
static BOOST_CXX14_CONSTEXPR ymd_type from_day_number(date_int_type);
|
||||
static BOOST_CXX14_CONSTEXPR ymd_type from_julian_day_number(date_int_type);
|
||||
static BOOST_CXX14_CONSTEXPR ymd_type from_modjulian_day_number(date_int_type);
|
||||
static BOOST_CXX14_CONSTEXPR bool is_leap_year(year_type);
|
||||
static BOOST_CXX14_CONSTEXPR unsigned short end_of_month_day(year_type y, month_type m);
|
||||
static BOOST_CXX14_CONSTEXPR ymd_type epoch();
|
||||
static BOOST_CXX14_CONSTEXPR unsigned short days_in_week();
|
||||
|
||||
};
|
||||
|
||||
@@ -59,9 +59,8 @@ namespace date_time {
|
||||
|
||||
} } //namespace
|
||||
|
||||
#ifndef NO_BOOST_DATE_TIME_INLINE
|
||||
#include "boost/date_time/gregorian_calendar.ipp"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -6,10 +6,6 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#ifndef NO_BOOST_DATE_TIME_INLINE
|
||||
#undef BOOST_DATE_TIME_INLINE
|
||||
#define BOOST_DATE_TIME_INLINE inline
|
||||
#endif
|
||||
|
||||
namespace boost {
|
||||
namespace date_time {
|
||||
@@ -17,7 +13,8 @@ namespace date_time {
|
||||
/*! Converts a year-month-day into a day of the week number
|
||||
*/
|
||||
template<typename ymd_type_, typename date_int_type_>
|
||||
BOOST_DATE_TIME_INLINE
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
inline
|
||||
unsigned short
|
||||
gregorian_calendar_base<ymd_type_,date_int_type_>::day_of_week(const ymd_type& ymd) {
|
||||
unsigned short a = static_cast<unsigned short>((14-ymd.month)/12);
|
||||
@@ -28,14 +25,15 @@ namespace date_time {
|
||||
return d;
|
||||
}
|
||||
|
||||
//!Return the iso week number for the date
|
||||
/*!Implements the rules associated with the iso 8601 week number.
|
||||
//!Return the ISO 8601 week number for the date
|
||||
/*!Implements the rules associated with the ISO 8601 week number.
|
||||
Basically the rule is that Week 1 of the year is the week that contains
|
||||
January 4th or the week that contains the first Thursday in January.
|
||||
Reference for this algorithm is the Calendar FAQ by Claus Tondering, April 2000.
|
||||
*/
|
||||
template<typename ymd_type_, typename date_int_type_>
|
||||
BOOST_DATE_TIME_INLINE
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
inline
|
||||
int
|
||||
gregorian_calendar_base<ymd_type_,date_int_type_>::week_number(const ymd_type& ymd) {
|
||||
unsigned long julianbegin = julian_day_number(ymd_type(ymd.year,1,1));
|
||||
@@ -44,12 +42,12 @@ namespace date_time {
|
||||
unsigned long week = (juliantoday + day - julianbegin + 4)/7;
|
||||
|
||||
if ((week >= 1) && (week <= 52)) {
|
||||
return week;
|
||||
return static_cast<int>(week);
|
||||
}
|
||||
|
||||
if ((week == 53)) {
|
||||
if (week == 53) {
|
||||
if((day==6) ||(day == 5 && is_leap_year(ymd.year))) {
|
||||
return week; //under these circumstances week == 53.
|
||||
return static_cast<int>(week); //under these circumstances week == 53.
|
||||
} else {
|
||||
return 1; //monday - wednesday is in week 1 of next year
|
||||
}
|
||||
@@ -60,10 +58,10 @@ namespace date_time {
|
||||
juliantoday = julian_day_number(ymd);
|
||||
day = (julianbegin + 3) % 7;
|
||||
week = (juliantoday + day - julianbegin + 4)/7;
|
||||
return week;
|
||||
return static_cast<int>(week);
|
||||
}
|
||||
|
||||
return week; //not reachable -- well except if day == 5 and is_leap_year != true
|
||||
return static_cast<int>(week); //not reachable -- well except if day == 5 and is_leap_year != true
|
||||
|
||||
}
|
||||
|
||||
@@ -71,22 +69,24 @@ namespace date_time {
|
||||
/*! The day number is an absolute number of days since the start of count
|
||||
*/
|
||||
template<typename ymd_type_, typename date_int_type_>
|
||||
BOOST_DATE_TIME_INLINE
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
inline
|
||||
date_int_type_
|
||||
gregorian_calendar_base<ymd_type_,date_int_type_>::day_number(const ymd_type& ymd)
|
||||
{
|
||||
unsigned short a = static_cast<unsigned short>((14-ymd.month)/12);
|
||||
unsigned short y = static_cast<unsigned short>(ymd.year + 4800 - a);
|
||||
unsigned short m = static_cast<unsigned short>(ymd.month + 12*a - 3);
|
||||
unsigned long d = ymd.day + ((153*m + 2)/5) + 365*y + (y/4) - (y/100) + (y/400) - 32045;
|
||||
return d;
|
||||
unsigned long d = static_cast<unsigned long>(ymd.day) + ((153*m + 2)/5) + 365*y + (y/4) - (y/100) + (y/400) - 32045;
|
||||
return static_cast<date_int_type>(d);
|
||||
}
|
||||
|
||||
//! Convert a year-month-day into the julian day number
|
||||
/*! Since this implementation uses julian day internally, this is the same as the day_number.
|
||||
*/
|
||||
template<typename ymd_type_, typename date_int_type_>
|
||||
BOOST_DATE_TIME_INLINE
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
inline
|
||||
date_int_type_
|
||||
gregorian_calendar_base<ymd_type_,date_int_type_>::julian_day_number(const ymd_type& ymd)
|
||||
{
|
||||
@@ -98,7 +98,8 @@ namespace date_time {
|
||||
* MJD 0 thus started on 17 Nov 1858(Gregorian) at 00:00:00 UTC
|
||||
*/
|
||||
template<typename ymd_type_, typename date_int_type_>
|
||||
BOOST_DATE_TIME_INLINE
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
inline
|
||||
date_int_type_
|
||||
gregorian_calendar_base<ymd_type_,date_int_type_>::modjulian_day_number(const ymd_type& ymd)
|
||||
{
|
||||
@@ -107,7 +108,8 @@ namespace date_time {
|
||||
|
||||
//! Change a day number into a year-month-day
|
||||
template<typename ymd_type_, typename date_int_type_>
|
||||
BOOST_DATE_TIME_INLINE
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
inline
|
||||
ymd_type_
|
||||
gregorian_calendar_base<ymd_type_,date_int_type_>::from_day_number(date_int_type dayNumber)
|
||||
{
|
||||
@@ -127,7 +129,8 @@ namespace date_time {
|
||||
|
||||
//! Change a day number into a year-month-day
|
||||
template<typename ymd_type_, typename date_int_type_>
|
||||
BOOST_DATE_TIME_INLINE
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
inline
|
||||
ymd_type_
|
||||
gregorian_calendar_base<ymd_type_,date_int_type_>::from_julian_day_number(date_int_type dayNumber)
|
||||
{
|
||||
@@ -147,7 +150,8 @@ namespace date_time {
|
||||
|
||||
//! Change a modified julian day number into a year-month-day
|
||||
template<typename ymd_type_, typename date_int_type_>
|
||||
BOOST_DATE_TIME_INLINE
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
inline
|
||||
ymd_type_
|
||||
gregorian_calendar_base<ymd_type_,date_int_type_>::from_modjulian_day_number(date_int_type dayNumber) {
|
||||
date_int_type jd = dayNumber + 2400001; //is 2400000.5 prerounded
|
||||
@@ -159,7 +163,8 @@ namespace date_time {
|
||||
*@return true if year is a leap year, false otherwise
|
||||
*/
|
||||
template<typename ymd_type_, typename date_int_type_>
|
||||
BOOST_DATE_TIME_INLINE
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
inline
|
||||
bool
|
||||
gregorian_calendar_base<ymd_type_,date_int_type_>::is_leap_year(year_type year)
|
||||
{
|
||||
@@ -172,7 +177,8 @@ namespace date_time {
|
||||
* No error checking is performed.
|
||||
*/
|
||||
template<typename ymd_type_, typename date_int_type_>
|
||||
BOOST_DATE_TIME_INLINE
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
inline
|
||||
unsigned short
|
||||
gregorian_calendar_base<ymd_type_,date_int_type_>::end_of_month_day(year_type year,
|
||||
month_type month)
|
||||
@@ -183,7 +189,7 @@ namespace date_time {
|
||||
return 29;
|
||||
} else {
|
||||
return 28;
|
||||
};
|
||||
}
|
||||
case 4:
|
||||
case 6:
|
||||
case 9:
|
||||
@@ -191,13 +197,13 @@ namespace date_time {
|
||||
return 30;
|
||||
default:
|
||||
return 31;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//! Provide the ymd_type specification for the calandar start
|
||||
//! Provide the ymd_type specification for the calendar start
|
||||
template<typename ymd_type_, typename date_int_type_>
|
||||
BOOST_DATE_TIME_INLINE
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
inline
|
||||
ymd_type_
|
||||
gregorian_calendar_base<ymd_type_,date_int_type_>::epoch()
|
||||
{
|
||||
@@ -206,7 +212,8 @@ namespace date_time {
|
||||
|
||||
//! Defines length of a week for week calculations
|
||||
template<typename ymd_type_, typename date_int_type_>
|
||||
BOOST_DATE_TIME_INLINE
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
inline
|
||||
unsigned short
|
||||
gregorian_calendar_base<ymd_type_,date_int_type_>::days_in_week()
|
||||
{
|
||||
@@ -215,5 +222,3 @@ namespace date_time {
|
||||
|
||||
|
||||
} } //namespace gregorian
|
||||
|
||||
|
||||
|
||||
@@ -18,6 +18,12 @@
|
||||
# include <ostream>
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_MSVC)
|
||||
#pragma warning(push)
|
||||
// conditional expression is constant
|
||||
#pragma warning(disable: 4127)
|
||||
#endif
|
||||
|
||||
namespace boost {
|
||||
namespace date_time {
|
||||
|
||||
@@ -40,34 +46,34 @@ template<typename int_type_>
|
||||
class int_adapter {
|
||||
public:
|
||||
typedef int_type_ int_type;
|
||||
int_adapter(int_type v) :
|
||||
BOOST_CXX14_CONSTEXPR int_adapter(int_type v) :
|
||||
value_(v)
|
||||
{}
|
||||
static bool has_infinity()
|
||||
static BOOST_CONSTEXPR bool has_infinity()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
static const int_adapter pos_infinity()
|
||||
static BOOST_CONSTEXPR int_adapter pos_infinity()
|
||||
{
|
||||
return (::std::numeric_limits<int_type>::max)();
|
||||
}
|
||||
static const int_adapter neg_infinity()
|
||||
static BOOST_CONSTEXPR int_adapter neg_infinity()
|
||||
{
|
||||
return (::std::numeric_limits<int_type>::min)();
|
||||
}
|
||||
static const int_adapter not_a_number()
|
||||
static BOOST_CONSTEXPR int_adapter not_a_number()
|
||||
{
|
||||
return (::std::numeric_limits<int_type>::max)()-1;
|
||||
}
|
||||
static int_adapter max BOOST_PREVENT_MACRO_SUBSTITUTION ()
|
||||
static BOOST_CONSTEXPR int_adapter max BOOST_PREVENT_MACRO_SUBSTITUTION ()
|
||||
{
|
||||
return (::std::numeric_limits<int_type>::max)()-2;
|
||||
}
|
||||
static int_adapter min BOOST_PREVENT_MACRO_SUBSTITUTION ()
|
||||
static BOOST_CONSTEXPR int_adapter min BOOST_PREVENT_MACRO_SUBSTITUTION ()
|
||||
{
|
||||
return (::std::numeric_limits<int_type>::min)()+1;
|
||||
}
|
||||
static int_adapter from_special(special_values sv)
|
||||
static BOOST_CXX14_CONSTEXPR int_adapter from_special(special_values sv)
|
||||
{
|
||||
switch (sv) {
|
||||
case not_a_date_time: return not_a_number();
|
||||
@@ -78,25 +84,25 @@ public:
|
||||
default: return not_a_number();
|
||||
}
|
||||
}
|
||||
static bool is_inf(int_type v)
|
||||
static BOOST_CONSTEXPR bool is_inf(int_type v)
|
||||
{
|
||||
return (v == neg_infinity().as_number() ||
|
||||
v == pos_infinity().as_number());
|
||||
}
|
||||
static bool is_neg_inf(int_type v)
|
||||
static BOOST_CXX14_CONSTEXPR bool is_neg_inf(int_type v)
|
||||
{
|
||||
return (v == neg_infinity().as_number());
|
||||
}
|
||||
static bool is_pos_inf(int_type v)
|
||||
static BOOST_CXX14_CONSTEXPR bool is_pos_inf(int_type v)
|
||||
{
|
||||
return (v == pos_infinity().as_number());
|
||||
}
|
||||
static bool is_not_a_number(int_type v)
|
||||
static BOOST_CXX14_CONSTEXPR bool is_not_a_number(int_type v)
|
||||
{
|
||||
return (v == not_a_number().as_number());
|
||||
}
|
||||
//! Returns either special value type or is_not_special
|
||||
static special_values to_special(int_type v)
|
||||
static BOOST_CXX14_CONSTEXPR special_values to_special(int_type v)
|
||||
{
|
||||
if (is_not_a_number(v)) return not_a_date_time;
|
||||
if (is_neg_inf(v)) return neg_infin;
|
||||
@@ -105,40 +111,38 @@ public:
|
||||
}
|
||||
|
||||
//-3 leaves room for representations of infinity and not a date
|
||||
static int_type maxcount()
|
||||
static BOOST_CONSTEXPR int_type maxcount()
|
||||
{
|
||||
return (::std::numeric_limits<int_type>::max)()-3;
|
||||
}
|
||||
bool is_infinity() const
|
||||
BOOST_CONSTEXPR bool is_infinity() const
|
||||
{
|
||||
return (value_ == neg_infinity().as_number() ||
|
||||
value_ == pos_infinity().as_number());
|
||||
}
|
||||
bool is_pos_infinity()const
|
||||
BOOST_CONSTEXPR bool is_pos_infinity()const
|
||||
{
|
||||
return(value_ == pos_infinity().as_number());
|
||||
}
|
||||
bool is_neg_infinity()const
|
||||
BOOST_CONSTEXPR bool is_neg_infinity()const
|
||||
{
|
||||
return(value_ == neg_infinity().as_number());
|
||||
}
|
||||
bool is_nan() const
|
||||
BOOST_CONSTEXPR bool is_nan() const
|
||||
{
|
||||
return (value_ == not_a_number().as_number());
|
||||
}
|
||||
bool is_special() const
|
||||
BOOST_CONSTEXPR bool is_special() const
|
||||
{
|
||||
return(is_infinity() || is_nan());
|
||||
}
|
||||
bool operator==(const int_adapter& rhs) const
|
||||
BOOST_CONSTEXPR bool operator==(const int_adapter& rhs) const
|
||||
{
|
||||
return (compare(rhs) == 0);
|
||||
}
|
||||
bool operator==(const int& rhs) const
|
||||
BOOST_CXX14_CONSTEXPR bool operator==(const int& rhs) const
|
||||
{
|
||||
// quiets compiler warnings
|
||||
bool is_signed = std::numeric_limits<int_type>::is_signed;
|
||||
if(!is_signed)
|
||||
if(!std::numeric_limits<int_type>::is_signed)
|
||||
{
|
||||
if(is_neg_inf(value_) && rhs == 0)
|
||||
{
|
||||
@@ -147,15 +151,13 @@ public:
|
||||
}
|
||||
return (compare(rhs) == 0);
|
||||
}
|
||||
bool operator!=(const int_adapter& rhs) const
|
||||
BOOST_CONSTEXPR bool operator!=(const int_adapter& rhs) const
|
||||
{
|
||||
return (compare(rhs) != 0);
|
||||
}
|
||||
bool operator!=(const int& rhs) const
|
||||
BOOST_CXX14_CONSTEXPR bool operator!=(const int& rhs) const
|
||||
{
|
||||
// quiets compiler warnings
|
||||
bool is_signed = std::numeric_limits<int_type>::is_signed;
|
||||
if(!is_signed)
|
||||
if(!std::numeric_limits<int_type>::is_signed)
|
||||
{
|
||||
if(is_neg_inf(value_) && rhs == 0)
|
||||
{
|
||||
@@ -164,15 +166,14 @@ public:
|
||||
}
|
||||
return (compare(rhs) != 0);
|
||||
}
|
||||
bool operator<(const int_adapter& rhs) const
|
||||
BOOST_CONSTEXPR bool operator<(const int_adapter& rhs) const
|
||||
{
|
||||
return (compare(rhs) == -1);
|
||||
}
|
||||
bool operator<(const int& rhs) const
|
||||
BOOST_CXX14_CONSTEXPR bool operator<(const int& rhs) const
|
||||
{
|
||||
// quiets compiler warnings
|
||||
bool is_signed = std::numeric_limits<int_type>::is_signed;
|
||||
if(!is_signed)
|
||||
if(!std::numeric_limits<int_type>::is_signed)
|
||||
{
|
||||
if(is_neg_inf(value_) && rhs == 0)
|
||||
{
|
||||
@@ -181,16 +182,16 @@ public:
|
||||
}
|
||||
return (compare(rhs) == -1);
|
||||
}
|
||||
bool operator>(const int_adapter& rhs) const
|
||||
BOOST_CONSTEXPR bool operator>(const int_adapter& rhs) const
|
||||
{
|
||||
return (compare(rhs) == 1);
|
||||
}
|
||||
int_type as_number() const
|
||||
BOOST_CONSTEXPR int_type as_number() const
|
||||
{
|
||||
return value_;
|
||||
}
|
||||
//! Returns either special value type or is_not_special
|
||||
special_values as_special() const
|
||||
BOOST_CONSTEXPR special_values as_special() const
|
||||
{
|
||||
return int_adapter::to_special(value_);
|
||||
}
|
||||
@@ -203,7 +204,7 @@ public:
|
||||
/*! Operator allows for adding dissimilar int_adapter types.
|
||||
* The return type will match that of the the calling object's type */
|
||||
template<class rhs_type>
|
||||
inline
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
int_adapter operator+(const int_adapter<rhs_type>& rhs) const
|
||||
{
|
||||
if(is_special() || rhs.is_special())
|
||||
@@ -230,9 +231,10 @@ public:
|
||||
return int_adapter::neg_infinity();
|
||||
}
|
||||
}
|
||||
return int_adapter<int_type>(value_ + rhs.as_number());
|
||||
return int_adapter<int_type>(value_ + static_cast<int_type>(rhs.as_number()));
|
||||
}
|
||||
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
int_adapter operator+(const int_type rhs) const
|
||||
{
|
||||
if(is_special())
|
||||
@@ -252,7 +254,7 @@ public:
|
||||
/*! Operator allows for subtracting dissimilar int_adapter types.
|
||||
* The return type will match that of the the calling object's type */
|
||||
template<class rhs_type>
|
||||
inline
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
int_adapter operator-(const int_adapter<rhs_type>& rhs)const
|
||||
{
|
||||
if(is_special() || rhs.is_special())
|
||||
@@ -279,8 +281,10 @@ public:
|
||||
return int_adapter::pos_infinity();
|
||||
}
|
||||
}
|
||||
return int_adapter<int_type>(value_ - rhs.as_number());
|
||||
return int_adapter<int_type>(value_ - static_cast<int_type>(rhs.as_number()));
|
||||
}
|
||||
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
int_adapter operator-(const int_type rhs) const
|
||||
{
|
||||
if(is_special())
|
||||
@@ -298,6 +302,7 @@ public:
|
||||
}
|
||||
|
||||
// should templatize this to be consistant with op +-
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
int_adapter operator*(const int_adapter& rhs)const
|
||||
{
|
||||
if(this->is_special() || rhs.is_special())
|
||||
@@ -306,8 +311,10 @@ public:
|
||||
}
|
||||
return int_adapter<int_type>(value_ * rhs.value_);
|
||||
}
|
||||
|
||||
/*! Provided for cases when automatic conversion from
|
||||
* 'int' to 'int_adapter' causes incorrect results. */
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
int_adapter operator*(const int rhs) const
|
||||
{
|
||||
if(is_special())
|
||||
@@ -318,6 +325,7 @@ public:
|
||||
}
|
||||
|
||||
// should templatize this to be consistant with op +-
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
int_adapter operator/(const int_adapter& rhs)const
|
||||
{
|
||||
if(this->is_special() || rhs.is_special())
|
||||
@@ -331,23 +339,27 @@ public:
|
||||
return mult_div_specials(rhs);
|
||||
}
|
||||
else { // let divide by zero blow itself up
|
||||
return int_adapter<int_type>(value_ / rhs.value_);
|
||||
return int_adapter<int_type>(value_ / rhs.value_); //NOLINT
|
||||
}
|
||||
}
|
||||
return int_adapter<int_type>(value_ / rhs.value_);
|
||||
}
|
||||
|
||||
/*! Provided for cases when automatic conversion from
|
||||
* 'int' to 'int_adapter' causes incorrect results. */
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
int_adapter operator/(const int rhs) const
|
||||
{
|
||||
if(is_special() && rhs != 0)
|
||||
{
|
||||
return mult_div_specials(rhs);
|
||||
}
|
||||
return int_adapter<int_type>(value_ / rhs);
|
||||
// let divide by zero blow itself up like int
|
||||
return int_adapter<int_type>(value_ / rhs); //NOLINT
|
||||
}
|
||||
|
||||
// should templatize this to be consistant with op +-
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
int_adapter operator%(const int_adapter& rhs)const
|
||||
{
|
||||
if(this->is_special() || rhs.is_special())
|
||||
@@ -361,26 +373,31 @@ public:
|
||||
return mult_div_specials(rhs);
|
||||
}
|
||||
else { // let divide by zero blow itself up
|
||||
return int_adapter<int_type>(value_ % rhs.value_);
|
||||
return int_adapter<int_type>(value_ % rhs.value_); //NOLINT
|
||||
}
|
||||
}
|
||||
return int_adapter<int_type>(value_ % rhs.value_);
|
||||
}
|
||||
|
||||
/*! Provided for cases when automatic conversion from
|
||||
* 'int' to 'int_adapter' causes incorrect results. */
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
int_adapter operator%(const int rhs) const
|
||||
{
|
||||
if(is_special() && rhs != 0)
|
||||
{
|
||||
return mult_div_specials(rhs);
|
||||
}
|
||||
return int_adapter<int_type>(value_ % rhs);
|
||||
// let divide by zero blow itself up
|
||||
return int_adapter<int_type>(value_ % rhs); //NOLINT
|
||||
}
|
||||
|
||||
private:
|
||||
int_type value_;
|
||||
|
||||
//! returns -1, 0, 1, or 2 if 'this' is <, ==, >, or 'nan comparison' rhs
|
||||
int compare(const int_adapter& rhs)const
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
int compare( const int_adapter& rhs ) const
|
||||
{
|
||||
if(this->is_special() || rhs.is_special())
|
||||
{
|
||||
@@ -407,25 +424,19 @@ private:
|
||||
// implied-> if(value_ == rhs.value_)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* When multiplying and dividing with at least 1 special value
|
||||
* very simmilar rules apply. In those cases where the rules
|
||||
* are different, they are handled in the respective operator
|
||||
* function. */
|
||||
//! Assumes at least 'this' or 'rhs' is a special value
|
||||
int_adapter mult_div_specials(const int_adapter& rhs)const
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
int_adapter mult_div_specials(const int_adapter& rhs) const
|
||||
{
|
||||
int min_value;
|
||||
// quiets compiler warnings
|
||||
bool is_signed = std::numeric_limits<int_type>::is_signed;
|
||||
if(is_signed) {
|
||||
min_value = 0;
|
||||
}
|
||||
else {
|
||||
min_value = 1;// there is no zero with unsigned
|
||||
}
|
||||
if(this->is_nan() || rhs.is_nan()) {
|
||||
return int_adapter<int_type>(not_a_number());
|
||||
}
|
||||
BOOST_CONSTEXPR_OR_CONST int min_value = std::numeric_limits<int_type>::is_signed ? 0 : 1;
|
||||
if((*this > 0 && rhs > 0) || (*this < min_value && rhs < min_value)) {
|
||||
return int_adapter<int_type>(pos_infinity());
|
||||
}
|
||||
@@ -435,26 +446,20 @@ private:
|
||||
//implied -> if(this->value_ == 0 || rhs.value_ == 0)
|
||||
return int_adapter<int_type>(not_a_number());
|
||||
}
|
||||
|
||||
/* Overloaded function necessary because of special
|
||||
* situation where int_adapter is instantiated with
|
||||
* 'unsigned' and func is called with negative int.
|
||||
* It would produce incorrect results since 'unsigned'
|
||||
* wraps around when initialized with a negative value */
|
||||
//! Assumes 'this' is a special value
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
int_adapter mult_div_specials(const int& rhs) const
|
||||
{
|
||||
int min_value;
|
||||
// quiets compiler warnings
|
||||
bool is_signed = std::numeric_limits<int_type>::is_signed;
|
||||
if(is_signed) {
|
||||
min_value = 0;
|
||||
}
|
||||
else {
|
||||
min_value = 1;// there is no zero with unsigned
|
||||
}
|
||||
if(this->is_nan()) {
|
||||
return int_adapter<int_type>(not_a_number());
|
||||
}
|
||||
BOOST_CONSTEXPR_OR_CONST int min_value = std::numeric_limits<int_type>::is_signed ? 0 : 1;
|
||||
if((*this > 0 && rhs > 0) || (*this < min_value && rhs < 0)) {
|
||||
return int_adapter<int_type>(pos_infinity());
|
||||
}
|
||||
@@ -464,7 +469,7 @@ private:
|
||||
//implied -> if(this->value_ == 0 || rhs.value_ == 0)
|
||||
return int_adapter<int_type>(not_a_number());
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
#ifndef BOOST_DATE_TIME_NO_LOCALE
|
||||
@@ -504,6 +509,8 @@ private:
|
||||
|
||||
} } //namespace date_time
|
||||
|
||||
|
||||
#if defined(BOOST_MSVC)
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -14,11 +14,11 @@
|
||||
namespace boost {
|
||||
namespace date_time {
|
||||
|
||||
//! Class to provide common iso formatting spec
|
||||
//! Class to provide common ISO 8601 formatting spec
|
||||
template<class charT>
|
||||
class iso_format_base {
|
||||
public:
|
||||
//! Describe month format -- its an integer in iso format
|
||||
//! Describe month format -- its an integer in ISO 8601 format
|
||||
static month_format_spec month_format()
|
||||
{
|
||||
return month_as_integer;
|
||||
@@ -40,17 +40,17 @@ public:
|
||||
return "-infinity";
|
||||
}
|
||||
|
||||
//! ISO char for a year -- used in durations
|
||||
//! ISO 8601 char for a year -- used in durations
|
||||
static charT year_sep_char()
|
||||
{
|
||||
return 'Y';
|
||||
}
|
||||
//! ISO char for a month
|
||||
//! ISO 8601 char for a month
|
||||
static charT month_sep_char()
|
||||
{
|
||||
return '-';
|
||||
}
|
||||
//! ISO char for a day
|
||||
//! ISO 8601 char for a day
|
||||
static charT day_sep_char()
|
||||
{
|
||||
return '-';
|
||||
@@ -70,7 +70,7 @@ public:
|
||||
{
|
||||
return ':';
|
||||
}
|
||||
//! ISO char for a period
|
||||
//! ISO 8601 char for a period
|
||||
static charT period_start_char()
|
||||
{
|
||||
return 'P';
|
||||
@@ -143,11 +143,11 @@ public:
|
||||
|
||||
#ifndef BOOST_NO_STD_WSTRING
|
||||
|
||||
//! Class to provide common iso formatting spec
|
||||
//! Class to provide common ISO 8601 formatting spec
|
||||
template<>
|
||||
class iso_format_base<wchar_t> {
|
||||
public:
|
||||
//! Describe month format -- its an integer in iso format
|
||||
//! Describe month format -- its an integer in ISO 8601 format
|
||||
static month_format_spec month_format()
|
||||
{
|
||||
return month_as_integer;
|
||||
@@ -169,17 +169,17 @@ public:
|
||||
return L"-infinity";
|
||||
}
|
||||
|
||||
//! ISO char for a year -- used in durations
|
||||
//! ISO 8601 char for a year -- used in durations
|
||||
static wchar_t year_sep_char()
|
||||
{
|
||||
return 'Y';
|
||||
}
|
||||
//! ISO char for a month
|
||||
//! ISO 8601 char for a month
|
||||
static wchar_t month_sep_char()
|
||||
{
|
||||
return '-';
|
||||
}
|
||||
//! ISO char for a day
|
||||
//! ISO 8601 char for a day
|
||||
static wchar_t day_sep_char()
|
||||
{
|
||||
return '-';
|
||||
@@ -199,7 +199,7 @@ public:
|
||||
{
|
||||
return ':';
|
||||
}
|
||||
//! ISO char for a period
|
||||
//! ISO 8601 char for a period
|
||||
static wchar_t period_start_char()
|
||||
{
|
||||
return 'P';
|
||||
@@ -272,7 +272,7 @@ public:
|
||||
|
||||
#endif // BOOST_NO_STD_WSTRING
|
||||
|
||||
//! Format description for iso normal YYYYMMDD
|
||||
//! Format description for ISO 8601 normal YYYYMMDD
|
||||
template<class charT>
|
||||
class iso_format : public iso_format_base<charT> {
|
||||
public:
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define LOCAL_TIME_CUSTOM_TIME_ZONE_HPP__
|
||||
|
||||
/* Copyright (c) 2003-2005 CrystalClear Software, Inc.
|
||||
* Subject to the Boost Software License, Version 1.0.
|
||||
* Subject to the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
* Author: Jeff Garland, Bart Garst
|
||||
* $Date$
|
||||
@@ -34,8 +34,8 @@ namespace local_time {
|
||||
typedef typename base_type::stringstream_type stringstream_type;
|
||||
typedef date_time::time_zone_names_base<CharT> time_zone_names;
|
||||
typedef CharT char_type;
|
||||
|
||||
custom_time_zone_base(const time_zone_names& zone_names,
|
||||
|
||||
custom_time_zone_base(const time_zone_names& zone_names,
|
||||
const time_duration_type& utc_offset,
|
||||
const dst_adjustment_offsets& dst_shift,
|
||||
boost::shared_ptr<dst_calc_rule> calc_rule) :
|
||||
@@ -43,8 +43,8 @@ namespace local_time {
|
||||
base_utc_offset_(utc_offset),
|
||||
dst_offsets_(dst_shift),
|
||||
dst_calc_rules_(calc_rule)
|
||||
{};
|
||||
virtual ~custom_time_zone_base() {};
|
||||
{}
|
||||
virtual ~custom_time_zone_base() {}
|
||||
virtual string_type dst_zone_abbrev() const
|
||||
{
|
||||
return zone_names_.dst_zone_abbrev();
|
||||
@@ -64,7 +64,7 @@ namespace local_time {
|
||||
//! True if zone uses daylight savings adjustments
|
||||
virtual bool has_dst() const
|
||||
{
|
||||
return (dst_calc_rules_); //if calc_rule is set the tz has dst
|
||||
return (bool) dst_calc_rules_; //if calc_rule is set the tz has dst
|
||||
}
|
||||
//! Local time that DST starts -- NADT if has_dst is false
|
||||
virtual posix_time::ptime dst_local_start_time(gregorian::greg_year y) const
|
||||
@@ -154,7 +154,6 @@ namespace local_time {
|
||||
}
|
||||
private:
|
||||
time_zone_names zone_names_;
|
||||
bool has_dst_;
|
||||
time_duration_type base_utc_offset_;
|
||||
dst_adjustment_offsets dst_offsets_;
|
||||
boost::shared_ptr<dst_calc_rule> dst_calc_rules_;
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <boost/throw_exception.hpp>
|
||||
#include <boost/date_time/time.hpp>
|
||||
#include <boost/date_time/posix_time/posix_time.hpp> //todo remove?
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/dst_rules.hpp>
|
||||
#include <boost/date_time/time_zone_base.hpp>
|
||||
#include <boost/date_time/special_defs.hpp>
|
||||
@@ -25,18 +26,18 @@ namespace boost {
|
||||
namespace local_time {
|
||||
|
||||
//! simple exception for reporting when STD or DST cannot be determined
|
||||
struct ambiguous_result : public std::logic_error
|
||||
struct BOOST_SYMBOL_VISIBLE ambiguous_result : public std::logic_error
|
||||
{
|
||||
ambiguous_result (std::string const& msg = std::string()) :
|
||||
std::logic_error(std::string("Daylight Savings Results are ambiguous: " + msg)) {}
|
||||
};
|
||||
//! simple exception for when time label given cannot exist
|
||||
struct time_label_invalid : public std::logic_error
|
||||
struct BOOST_SYMBOL_VISIBLE time_label_invalid : public std::logic_error
|
||||
{
|
||||
time_label_invalid (std::string const& msg = std::string()) :
|
||||
std::logic_error(std::string("Time label given is invalid: " + msg)) {}
|
||||
};
|
||||
struct dst_not_valid: public std::logic_error
|
||||
struct BOOST_SYMBOL_VISIBLE dst_not_valid: public std::logic_error
|
||||
{
|
||||
dst_not_valid(std::string const& msg = std::string()) :
|
||||
std::logic_error(std::string("is_dst flag does not match resulting dst for time label given: " + msg)) {}
|
||||
@@ -61,7 +62,7 @@ namespace local_time {
|
||||
*/
|
||||
template<class utc_time_=posix_time::ptime,
|
||||
class tz_type=date_time::time_zone_base<utc_time_,char> >
|
||||
class local_date_time_base : public date_time::base_time<utc_time_,
|
||||
class BOOST_SYMBOL_VISIBLE local_date_time_base : public date_time::base_time<utc_time_,
|
||||
boost::posix_time::posix_time_system> {
|
||||
public:
|
||||
typedef utc_time_ utc_time_type;
|
||||
@@ -208,7 +209,7 @@ namespace local_time {
|
||||
}
|
||||
|
||||
//! Simple destructor, releases time zone if last referrer
|
||||
~local_date_time_base() {};
|
||||
~local_date_time_base() {}
|
||||
|
||||
//! Copy constructor
|
||||
local_date_time_base(const local_date_time_base& rhs) :
|
||||
@@ -314,7 +315,7 @@ namespace local_time {
|
||||
|
||||
//! Returns name of associated time zone or "Coordinated Universal Time".
|
||||
/*! Optional bool parameter will return time zone as an offset
|
||||
* (ie "+07:00" extended iso format). Empty string is returned for
|
||||
* (ie "+07:00" extended ISO 8601 format). Empty string is returned for
|
||||
* classes that do not use a time_zone */
|
||||
std::string zone_name(bool as_offset=false) const
|
||||
{
|
||||
@@ -348,7 +349,7 @@ namespace local_time {
|
||||
}
|
||||
//! Returns abbreviation of associated time zone or "UTC".
|
||||
/*! Optional bool parameter will return time zone as an offset
|
||||
* (ie "+0700" iso format). Empty string is returned for classes
|
||||
* (ie "+0700" ISO 8601 format). Empty string is returned for classes
|
||||
* that do not use a time_zone */
|
||||
std::string zone_abbrev(bool as_offset=false) const
|
||||
{
|
||||
|
||||
@@ -8,12 +8,15 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
#include <locale>
|
||||
#include <iostream>
|
||||
#include <iterator> // i/ostreambuf_iterator
|
||||
#include <boost/io/ios_state.hpp>
|
||||
#include <boost/date_time/special_defs.hpp>
|
||||
#include <boost/date_time/time_facet.hpp>
|
||||
#include <boost/date_time/string_convert.hpp>
|
||||
#include <boost/date_time/local_time/local_time_types.hpp>
|
||||
#include <boost/date_time/local_time/local_date_time.hpp>
|
||||
#include <boost/date_time/local_time/posix_time_zone.hpp>
|
||||
#include <boost/date_time/local_time/conversion.hpp> // to_tm will be needed in the facets
|
||||
@@ -36,7 +39,6 @@ namespace local_time {
|
||||
boost::io::ios_flags_saver iflags(os);
|
||||
typedef local_date_time time_type;//::utc_time_type typename
|
||||
typedef date_time::time_facet<time_type, CharT> custom_time_facet;
|
||||
typedef std::time_put<CharT> std_time_facet;
|
||||
std::ostreambuf_iterator<CharT> oitr(os);
|
||||
|
||||
if(std::has_facet<custom_time_facet>(os.getloc())) {
|
||||
@@ -123,7 +125,6 @@ namespace local_time {
|
||||
const boost::local_time::local_time_period& p) {
|
||||
boost::io::ios_flags_saver iflags(os);
|
||||
typedef boost::date_time::time_facet<local_date_time, CharT> custom_facet;
|
||||
typedef std::time_put<CharT> std_time_facet;
|
||||
std::ostreambuf_iterator<CharT> oitr(os);
|
||||
if (std::has_facet<custom_facet>(os.getloc())) {
|
||||
std::use_facet<custom_facet>(os.getloc()).put(oitr, os, os.fill(), p);
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <stdexcept>
|
||||
#include <boost/tokenizer.hpp>
|
||||
#include <boost/throw_exception.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/gregorian/gregorian.hpp>
|
||||
#include <boost/date_time/time_zone_names.hpp>
|
||||
#include <boost/date_time/time_zone_base.hpp>
|
||||
@@ -25,13 +26,13 @@ namespace boost{
|
||||
namespace local_time{
|
||||
|
||||
//! simple exception for UTC and Daylight savings start/end offsets
|
||||
struct bad_offset : public std::out_of_range
|
||||
struct BOOST_SYMBOL_VISIBLE bad_offset : public std::out_of_range
|
||||
{
|
||||
bad_offset(std::string const& msg = std::string()) :
|
||||
std::out_of_range(std::string("Offset out of range: " + msg)) {}
|
||||
};
|
||||
//! simple exception for UTC daylight savings adjustment
|
||||
struct bad_adjustment : public std::out_of_range
|
||||
struct BOOST_SYMBOL_VISIBLE bad_adjustment : public std::out_of_range
|
||||
{
|
||||
bad_adjustment(std::string const& msg = std::string()) :
|
||||
std::out_of_range(std::string("Adjustment out of range: " + msg)) {}
|
||||
@@ -67,7 +68,7 @@ namespace local_time{
|
||||
* http://www.worldtimezone.com/utc/utc+1200.html
|
||||
*/
|
||||
template<class CharT>
|
||||
class posix_time_zone_base : public date_time::time_zone_base<posix_time::ptime,CharT> {
|
||||
class BOOST_SYMBOL_VISIBLE posix_time_zone_base : public date_time::time_zone_base<posix_time::ptime,CharT> {
|
||||
public:
|
||||
typedef boost::posix_time::time_duration time_duration_type;
|
||||
typedef date_time::time_zone_names_base<CharT> time_zone_names;
|
||||
@@ -79,9 +80,7 @@ namespace local_time{
|
||||
typedef boost::tokenizer<char_separator_type,
|
||||
typename string_type::const_iterator,
|
||||
string_type> tokenizer_type;
|
||||
typedef typename boost::tokenizer<char_separator_type,
|
||||
typename string_type::const_iterator,
|
||||
string_type>::iterator tokenizer_iterator_type;
|
||||
typedef typename tokenizer_type::iterator tokenizer_iterator_type;
|
||||
|
||||
//! Construct from a POSIX time zone string
|
||||
posix_time_zone_base(const string_type& s) :
|
||||
@@ -101,14 +100,23 @@ namespace local_time{
|
||||
#endif
|
||||
char_separator_type sep(sep_chars);
|
||||
tokenizer_type tokens(s, sep);
|
||||
tokenizer_iterator_type it = tokens.begin();
|
||||
tokenizer_iterator_type it = tokens.begin(), end = tokens.end();
|
||||
if (it == end)
|
||||
BOOST_THROW_EXCEPTION(std::invalid_argument("Could not parse time zone name"));
|
||||
calc_zone(*it++);
|
||||
if(has_dst_){
|
||||
string_type tmp_str = *it++;
|
||||
calc_rules(tmp_str, *it);
|
||||
if(has_dst_)
|
||||
{
|
||||
if (it == end)
|
||||
BOOST_THROW_EXCEPTION(std::invalid_argument("Could not parse DST begin time"));
|
||||
string_type dst_begin = *it++;
|
||||
|
||||
if (it == end)
|
||||
BOOST_THROW_EXCEPTION(std::invalid_argument("Could not parse DST end time"));
|
||||
string_type dst_end = *it;
|
||||
calc_rules(dst_begin, dst_end);
|
||||
}
|
||||
}
|
||||
virtual ~posix_time_zone_base() {};
|
||||
virtual ~posix_time_zone_base() {}
|
||||
//!String for the zone when not in daylight savings (eg: EST)
|
||||
virtual string_type std_zone_abbrev()const
|
||||
{
|
||||
@@ -423,9 +431,9 @@ namespace local_time{
|
||||
dst_calc_rules_ = shared_ptr<dst_calc_rule>(
|
||||
new partial_date_dst_rule(
|
||||
partial_date_dst_rule::start_rule(
|
||||
sd, static_cast<date_time::months_of_year>(sm)),
|
||||
static_cast<unsigned short>(sd), static_cast<date_time::months_of_year>(sm)),
|
||||
partial_date_dst_rule::end_rule(
|
||||
ed, static_cast<date_time::months_of_year>(em))
|
||||
static_cast<unsigned short>(ed), static_cast<date_time::months_of_year>(em))
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef DATE_TIME_LOCALE_CONFIG_HPP___
|
||||
#define DATE_TIME_LOCALE_CONFIG_HPP___
|
||||
|
||||
/* Copyright (c) 2002-2006 CrystalClear Software, Inc.
|
||||
/* Copyright (c) 2002-2020 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
@@ -17,12 +17,14 @@
|
||||
// defines BOOST_NO_STD_LOCALE (gcc 2.95.x)
|
||||
|
||||
#include "boost/config.hpp" //sets BOOST_NO_STD_LOCALE
|
||||
#include "boost/detail/workaround.hpp"
|
||||
#include "boost/config/workaround.hpp"
|
||||
|
||||
//This file basically becomes a noop if locales are not properly supported
|
||||
#if (defined(BOOST_NO_STD_LOCALE) \
|
||||
|| (BOOST_WORKAROUND( BOOST_MSVC, < 1300)) \
|
||||
|| (BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT( 0x581 )) ) )
|
||||
|| (BOOST_WORKAROUND( BOOST_BORLANDC, BOOST_TESTED_AT( 0x581 )) ) \
|
||||
|| (BOOST_WORKAROUND( BOOST_XLCPP_ZOS, BOOST_TESTED_AT( 0x42010000 )) ) /* <cctype> "shadows" the locale enabled overloads from <locale> */ \
|
||||
)
|
||||
#define BOOST_DATE_TIME_NO_LOCALE
|
||||
#endif
|
||||
|
||||
|
||||
@@ -20,7 +20,9 @@
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/c_time.hpp>
|
||||
#include <boost/date_time/time_clock.hpp>
|
||||
#include <boost/date_time/filetime_functions.hpp>
|
||||
#if defined(BOOST_HAS_FTIME)
|
||||
#include <boost/winapi/time.hpp>
|
||||
#endif
|
||||
|
||||
#ifdef BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK
|
||||
|
||||
@@ -85,12 +87,21 @@ namespace date_time {
|
||||
std::time_t t = tv.tv_sec;
|
||||
boost::uint32_t sub_sec = tv.tv_usec;
|
||||
#elif defined(BOOST_HAS_FTIME)
|
||||
winapi::file_time ft;
|
||||
winapi::get_system_time_as_file_time(ft);
|
||||
uint64_t micros = winapi::file_time_to_microseconds(ft); // it will not wrap, since ft is the current time
|
||||
// and cannot be before 1970-Jan-01
|
||||
boost::winapi::FILETIME_ ft;
|
||||
boost::winapi::GetSystemTimeAsFileTime(&ft);
|
||||
#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205))
|
||||
// Some runtime library implementations expect local times as the norm for ctime functions.
|
||||
{
|
||||
boost::winapi::FILETIME_ local_ft;
|
||||
boost::winapi::FileTimeToLocalFileTime(&ft, &local_ft);
|
||||
ft = local_ft;
|
||||
}
|
||||
#endif
|
||||
|
||||
boost::uint64_t micros = file_time_to_microseconds(ft); // it will not wrap, since ft is the current time
|
||||
// and cannot be before 1970-Jan-01
|
||||
std::time_t t = static_cast<std::time_t>(micros / 1000000UL); // seconds since epoch
|
||||
// microseconds -- static casts supress warnings
|
||||
// microseconds -- static casts suppress warnings
|
||||
boost::uint32_t sub_sec = static_cast<boost::uint32_t>(micros % 1000000UL);
|
||||
#else
|
||||
#error Internal Boost.DateTime error: BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK is defined, however neither gettimeofday nor FILETIME support is detected.
|
||||
@@ -98,9 +109,9 @@ namespace date_time {
|
||||
|
||||
std::tm curr;
|
||||
std::tm* curr_ptr = converter(&t, &curr);
|
||||
date_type d(curr_ptr->tm_year + 1900,
|
||||
curr_ptr->tm_mon + 1,
|
||||
curr_ptr->tm_mday);
|
||||
date_type d(static_cast< typename date_type::year_type::value_type >(curr_ptr->tm_year + 1900),
|
||||
static_cast< typename date_type::month_type::value_type >(curr_ptr->tm_mon + 1),
|
||||
static_cast< typename date_type::day_type::value_type >(curr_ptr->tm_mday));
|
||||
|
||||
//The following line will adjust the fractional second tick in terms
|
||||
//of the current time system. For example, if the time system
|
||||
@@ -108,13 +119,33 @@ namespace date_time {
|
||||
//and all the fractional seconds return 0.
|
||||
int adjust = static_cast< int >(resolution_traits_type::res_adjust() / 1000000);
|
||||
|
||||
time_duration_type td(curr_ptr->tm_hour,
|
||||
curr_ptr->tm_min,
|
||||
curr_ptr->tm_sec,
|
||||
time_duration_type td(static_cast< typename time_duration_type::hour_type >(curr_ptr->tm_hour),
|
||||
static_cast< typename time_duration_type::min_type >(curr_ptr->tm_min),
|
||||
static_cast< typename time_duration_type::sec_type >(curr_ptr->tm_sec),
|
||||
sub_sec * adjust);
|
||||
|
||||
return time_type(d,td);
|
||||
}
|
||||
|
||||
#if defined(BOOST_HAS_FTIME)
|
||||
/*!
|
||||
* The function converts file_time into number of microseconds elapsed since 1970-Jan-01
|
||||
*
|
||||
* \note Only dates after 1970-Jan-01 are supported. Dates before will be wrapped.
|
||||
*/
|
||||
static boost::uint64_t file_time_to_microseconds(boost::winapi::FILETIME_ const& ft)
|
||||
{
|
||||
// shift is difference between 1970-Jan-01 & 1601-Jan-01
|
||||
// in 100-nanosecond units
|
||||
const boost::uint64_t shift = 116444736000000000ULL; // (27111902 << 32) + 3577643008
|
||||
|
||||
// 100-nanos since 1601-Jan-01
|
||||
boost::uint64_t ft_as_integer = (static_cast< boost::uint64_t >(ft.dwHighDateTime) << 32) | static_cast< boost::uint64_t >(ft.dwLowDateTime);
|
||||
|
||||
ft_as_integer -= shift; // filetime is now 100-nanos since 1970-Jan-01
|
||||
return (ft_as_integer / 10U); // truncate to microseconds
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -17,7 +17,8 @@
|
||||
|
||||
*/
|
||||
|
||||
#include "boost/operators.hpp"
|
||||
#include <boost/operators.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
|
||||
|
||||
namespace boost {
|
||||
@@ -48,7 +49,7 @@ namespace date_time {
|
||||
|
||||
*/
|
||||
template<class point_rep, class duration_rep>
|
||||
class period : private
|
||||
class BOOST_SYMBOL_VISIBLE period : private
|
||||
boost::less_than_comparable<period<point_rep, duration_rep>
|
||||
, boost::equality_comparable< period<point_rep, duration_rep>
|
||||
> >
|
||||
@@ -57,26 +58,26 @@ namespace date_time {
|
||||
typedef point_rep point_type;
|
||||
typedef duration_rep duration_type;
|
||||
|
||||
period(point_rep first_point, point_rep end_point);
|
||||
period(point_rep first_point, duration_rep len);
|
||||
point_rep begin() const;
|
||||
point_rep end() const;
|
||||
point_rep last() const;
|
||||
duration_rep length() const;
|
||||
bool is_null() const;
|
||||
bool operator==(const period& rhs) const;
|
||||
bool operator<(const period& rhs) const;
|
||||
void shift(const duration_rep& d);
|
||||
void expand(const duration_rep& d);
|
||||
bool contains(const point_rep& point) const;
|
||||
bool contains(const period& other) const;
|
||||
bool intersects(const period& other) const;
|
||||
bool is_adjacent(const period& other) const;
|
||||
bool is_before(const point_rep& point) const;
|
||||
bool is_after(const point_rep& point) const;
|
||||
period intersection(const period& other) const;
|
||||
period merge(const period& other) const;
|
||||
period span(const period& other) const;
|
||||
BOOST_CXX14_CONSTEXPR period(point_rep first_point, point_rep end_point);
|
||||
BOOST_CXX14_CONSTEXPR period(point_rep first_point, duration_rep len);
|
||||
BOOST_CXX14_CONSTEXPR point_rep begin() const;
|
||||
BOOST_CXX14_CONSTEXPR point_rep end() const;
|
||||
BOOST_CXX14_CONSTEXPR point_rep last() const;
|
||||
BOOST_CXX14_CONSTEXPR duration_rep length() const;
|
||||
BOOST_CXX14_CONSTEXPR bool is_null() const;
|
||||
BOOST_CXX14_CONSTEXPR bool operator==(const period& rhs) const;
|
||||
BOOST_CXX14_CONSTEXPR bool operator<(const period& rhs) const;
|
||||
BOOST_CXX14_CONSTEXPR void shift(const duration_rep& d);
|
||||
BOOST_CXX14_CONSTEXPR void expand(const duration_rep& d);
|
||||
BOOST_CXX14_CONSTEXPR bool contains(const point_rep& point) const;
|
||||
BOOST_CXX14_CONSTEXPR bool contains(const period& other) const;
|
||||
BOOST_CXX14_CONSTEXPR bool intersects(const period& other) const;
|
||||
BOOST_CXX14_CONSTEXPR bool is_adjacent(const period& other) const;
|
||||
BOOST_CXX14_CONSTEXPR bool is_before(const point_rep& point) const;
|
||||
BOOST_CXX14_CONSTEXPR bool is_after(const point_rep& point) const;
|
||||
BOOST_CXX14_CONSTEXPR period intersection(const period& other) const;
|
||||
BOOST_CXX14_CONSTEXPR period merge(const period& other) const;
|
||||
BOOST_CXX14_CONSTEXPR period span(const period& other) const;
|
||||
private:
|
||||
point_rep begin_;
|
||||
point_rep last_;
|
||||
@@ -86,7 +87,7 @@ namespace date_time {
|
||||
/*! If end <= begin then the period will be invalid
|
||||
*/
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
period<point_rep,duration_rep>::period(point_rep first_point,
|
||||
point_rep end_point) :
|
||||
begin_(first_point),
|
||||
@@ -97,7 +98,7 @@ namespace date_time {
|
||||
/*! If len is <= 0 then the period will be invalid
|
||||
*/
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
period<point_rep,duration_rep>::period(point_rep first_point, duration_rep len) :
|
||||
begin_(first_point),
|
||||
last_(first_point + len-duration_rep::unit())
|
||||
@@ -106,7 +107,7 @@ namespace date_time {
|
||||
|
||||
//! Return the first element in the period
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
point_rep period<point_rep,duration_rep>::begin() const
|
||||
{
|
||||
return begin_;
|
||||
@@ -114,7 +115,7 @@ namespace date_time {
|
||||
|
||||
//! Return one past the last element
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
point_rep period<point_rep,duration_rep>::end() const
|
||||
{
|
||||
return last_ + duration_rep::unit();
|
||||
@@ -122,7 +123,7 @@ namespace date_time {
|
||||
|
||||
//! Return the last item in the period
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
point_rep period<point_rep,duration_rep>::last() const
|
||||
{
|
||||
return last_;
|
||||
@@ -130,7 +131,7 @@ namespace date_time {
|
||||
|
||||
//! True if period is ill formed (length is zero or less)
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
bool period<point_rep,duration_rep>::is_null() const
|
||||
{
|
||||
return end() <= begin_;
|
||||
@@ -138,7 +139,7 @@ namespace date_time {
|
||||
|
||||
//! Return the length of the period
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
duration_rep period<point_rep,duration_rep>::length() const
|
||||
{
|
||||
if(last_ < begin_){ // invalid period
|
||||
@@ -151,7 +152,7 @@ namespace date_time {
|
||||
|
||||
//! Equality operator
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
bool period<point_rep,duration_rep>::operator==(const period& rhs) const
|
||||
{
|
||||
return ((begin_ == rhs.begin_) &&
|
||||
@@ -160,7 +161,7 @@ namespace date_time {
|
||||
|
||||
//! Strict as defined by rhs.last <= lhs.last
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
bool period<point_rep,duration_rep>::operator<(const period& rhs) const
|
||||
{
|
||||
return (last_ < rhs.begin_);
|
||||
@@ -169,7 +170,7 @@ namespace date_time {
|
||||
|
||||
//! Shift the start and end by the specified amount
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
void period<point_rep,duration_rep>::shift(const duration_rep& d)
|
||||
{
|
||||
begin_ = begin_ + d;
|
||||
@@ -196,7 +197,7 @@ namespace date_time {
|
||||
*@endcode
|
||||
*/
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
void period<point_rep,duration_rep>::expand(const duration_rep& d)
|
||||
{
|
||||
begin_ = begin_ - d;
|
||||
@@ -205,7 +206,7 @@ namespace date_time {
|
||||
|
||||
//! True if the point is inside the period, zero length periods contain no points
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
bool period<point_rep,duration_rep>::contains(const point_rep& point) const
|
||||
{
|
||||
return ((point >= begin_) &&
|
||||
@@ -215,7 +216,7 @@ namespace date_time {
|
||||
|
||||
//! True if this period fully contains (or equals) the other period
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
bool period<point_rep,duration_rep>::contains(const period<point_rep,duration_rep>& other) const
|
||||
{
|
||||
return ((begin_ <= other.begin_) && (last_ >= other.last_));
|
||||
@@ -232,9 +233,8 @@ namespace date_time {
|
||||
*@endcode
|
||||
*/
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
bool
|
||||
period<point_rep,duration_rep>::is_adjacent(const period<point_rep,duration_rep>& other) const
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
bool period<point_rep,duration_rep>::is_adjacent(const period<point_rep,duration_rep>& other) const
|
||||
{
|
||||
return (other.begin() == end() ||
|
||||
begin_ == other.end());
|
||||
@@ -251,9 +251,8 @@ namespace date_time {
|
||||
*@endcode
|
||||
*/
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
bool
|
||||
period<point_rep,duration_rep>::is_after(const point_rep& t) const
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
bool period<point_rep,duration_rep>::is_after(const point_rep& t) const
|
||||
{
|
||||
if (is_null())
|
||||
{
|
||||
@@ -273,9 +272,8 @@ namespace date_time {
|
||||
*@endcode
|
||||
*/
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
bool
|
||||
period<point_rep,duration_rep>::is_before(const point_rep& t) const
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
bool period<point_rep,duration_rep>::is_before(const point_rep& t) const
|
||||
{
|
||||
if (is_null())
|
||||
{
|
||||
@@ -298,17 +296,15 @@ namespace date_time {
|
||||
*@endcode
|
||||
*/
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
bool period<point_rep,duration_rep>::intersects(const period<point_rep,duration_rep>& other) const
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
bool period<point_rep,duration_rep>::intersects(const period<point_rep,duration_rep>& other) const
|
||||
{
|
||||
return ( contains(other.begin_) ||
|
||||
other.contains(begin_) ||
|
||||
((other.begin_ < begin_) && (other.last_ >= begin_)));
|
||||
return !is_null() && !other.is_null() && (begin_ < other.end()) && (other.begin_ < end());
|
||||
}
|
||||
|
||||
//! Returns the period of intersection or invalid range no intersection
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
period<point_rep,duration_rep>
|
||||
period<point_rep,duration_rep>::intersection(const period<point_rep,duration_rep>& other) const
|
||||
{
|
||||
@@ -333,7 +329,7 @@ namespace date_time {
|
||||
/*!
|
||||
*/
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
period<point_rep,duration_rep>
|
||||
period<point_rep,duration_rep>::merge(const period<point_rep,duration_rep>& other) const
|
||||
{
|
||||
@@ -360,7 +356,7 @@ namespace date_time {
|
||||
*@endcode
|
||||
*/
|
||||
template<class point_rep, class duration_rep>
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
period<point_rep,duration_rep>
|
||||
period<point_rep,duration_rep>::span(const period<point_rep,duration_rep>& other) const
|
||||
{
|
||||
|
||||
@@ -3,14 +3,17 @@
|
||||
#define DATETIME_PERIOD_FORMATTER_HPP___
|
||||
|
||||
/* Copyright (c) 2002-2004 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
* Author: Jeff Garland, Bart Garst
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
|
||||
#include <iosfwd>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <iterator>
|
||||
|
||||
namespace boost { namespace date_time {
|
||||
|
||||
@@ -19,14 +22,14 @@ namespace boost { namespace date_time {
|
||||
/*! Provides settings for the following:
|
||||
* - period_separator -- default '/'
|
||||
* - period_open_start_delimeter -- default '['
|
||||
* - period_open_range_end_delimeter -- default ')'
|
||||
* - period_closed_range_end_delimeter -- default ']'
|
||||
* - period_open_range_end_delimeter -- default ')'
|
||||
* - period_closed_range_end_delimeter -- default ']'
|
||||
* - display_as_open_range, display_as_closed_range -- default closed_range
|
||||
*
|
||||
* Thus the default formatting for a period is as follows:
|
||||
*@code
|
||||
* [period.start()/period.last()]
|
||||
*@endcode
|
||||
*@endcode
|
||||
* So for a typical date_period this would be
|
||||
*@code
|
||||
* [2004-Jan-04/2004-Feb-01]
|
||||
@@ -34,13 +37,13 @@ namespace boost { namespace date_time {
|
||||
* where the date formatting is controlled by the date facet
|
||||
*/
|
||||
template <class CharT, class OutItrT = std::ostreambuf_iterator<CharT, std::char_traits<CharT> > >
|
||||
class period_formatter {
|
||||
class period_formatter {
|
||||
public:
|
||||
typedef std::basic_string<CharT> string_type;
|
||||
typedef CharT char_type;
|
||||
typedef typename std::basic_string<char_type>::const_iterator const_itr_type;
|
||||
typedef std::vector<std::basic_string<CharT> > collection_type;
|
||||
|
||||
|
||||
static const char_type default_period_separator[2];
|
||||
static const char_type default_period_start_delimeter[2];
|
||||
static const char_type default_period_open_range_end_delimeter[2];
|
||||
@@ -49,8 +52,8 @@ namespace boost { namespace date_time {
|
||||
enum range_display_options { AS_OPEN_RANGE, AS_CLOSED_RANGE };
|
||||
|
||||
//! Constructor that sets up period formatter options -- default should suffice most cases.
|
||||
period_formatter(range_display_options range_option_in = AS_CLOSED_RANGE,
|
||||
const char_type* const period_separator = default_period_separator,
|
||||
period_formatter(range_display_options range_option_in = AS_CLOSED_RANGE,
|
||||
const char_type* const period_separator = default_period_separator,
|
||||
const char_type* const period_start_delimeter = default_period_start_delimeter,
|
||||
const char_type* const period_open_range_end_delimeter = default_period_open_range_end_delimeter,
|
||||
const char_type* const period_closed_range_end_delimeter = default_period_closed_range_end_delimeter) :
|
||||
@@ -62,7 +65,7 @@ namespace boost { namespace date_time {
|
||||
{}
|
||||
|
||||
//! Puts the characters between period elements into stream -- default is /
|
||||
OutItrT put_period_separator(OutItrT& oitr) const
|
||||
OutItrT put_period_separator(OutItrT& oitr) const
|
||||
{
|
||||
const_itr_type ci = m_period_separator.begin();
|
||||
while (ci != m_period_separator.end()) {
|
||||
@@ -73,7 +76,7 @@ namespace boost { namespace date_time {
|
||||
}
|
||||
|
||||
//! Puts the period start characters into stream -- default is [
|
||||
OutItrT put_period_start_delimeter(OutItrT& oitr) const
|
||||
OutItrT put_period_start_delimeter(OutItrT& oitr) const
|
||||
{
|
||||
const_itr_type ci = m_period_start_delimeter.begin();
|
||||
while (ci != m_period_start_delimeter.end()) {
|
||||
@@ -84,9 +87,9 @@ namespace boost { namespace date_time {
|
||||
}
|
||||
|
||||
//! Puts the period end characters into stream as controled by open/closed range setting.
|
||||
OutItrT put_period_end_delimeter(OutItrT& oitr) const
|
||||
OutItrT put_period_end_delimeter(OutItrT& oitr) const
|
||||
{
|
||||
|
||||
|
||||
const_itr_type ci, end;
|
||||
if (m_range_option == AS_OPEN_RANGE) {
|
||||
ci = m_open_range_end_delimeter.begin();
|
||||
@@ -102,40 +105,41 @@ namespace boost { namespace date_time {
|
||||
}
|
||||
return oitr;
|
||||
}
|
||||
|
||||
|
||||
range_display_options range_option() const
|
||||
{
|
||||
return m_range_option;
|
||||
}
|
||||
|
||||
//! Reset the range_option control
|
||||
void
|
||||
void
|
||||
range_option(range_display_options option) const
|
||||
{
|
||||
m_range_option = option;
|
||||
}
|
||||
|
||||
//! Change the delimiter strings
|
||||
void delimiter_strings(const string_type& separator,
|
||||
const string_type& start_delim,
|
||||
const string_type& open_end_delim,
|
||||
const string_type& closed_end_delim)
|
||||
{
|
||||
m_period_separator;
|
||||
m_period_start_delimeter;
|
||||
m_open_range_end_delimeter;
|
||||
m_closed_range_end_delimeter;
|
||||
m_period_separator = separator;
|
||||
m_period_start_delimeter = start_delim;
|
||||
m_open_range_end_delimeter = open_end_delim;
|
||||
m_closed_range_end_delimeter = closed_end_delim;
|
||||
}
|
||||
|
||||
|
||||
//! Generic code to output a period -- no matter the period type.
|
||||
/*! This generic code will output any period using a facet to
|
||||
* to output the 'elements'. For example, in the case of a date_period
|
||||
* the elements will be instances of a date which will be formatted
|
||||
* the elements will be instances of a date which will be formatted
|
||||
* according the to setup in the passed facet parameter.
|
||||
*
|
||||
*
|
||||
* The steps for formatting a period are always the same:
|
||||
* - put the start delimiter
|
||||
* - put start element
|
||||
* - put the separator
|
||||
* - put the separator
|
||||
* - put either last or end element depending on range settings
|
||||
* - put end delimeter depending on range settings
|
||||
*
|
||||
@@ -148,9 +152,9 @@ namespace boost { namespace date_time {
|
||||
*@endcode
|
||||
*/
|
||||
template<class period_type, class facet_type>
|
||||
OutItrT put_period(OutItrT next,
|
||||
std::ios_base& a_ios,
|
||||
char_type a_fill,
|
||||
OutItrT put_period(OutItrT next,
|
||||
std::ios_base& a_ios,
|
||||
char_type a_fill,
|
||||
const period_type& p,
|
||||
const facet_type& facet) const {
|
||||
put_period_start_delimeter(next);
|
||||
@@ -166,29 +170,29 @@ namespace boost { namespace date_time {
|
||||
return next;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private:
|
||||
range_display_options m_range_option;
|
||||
range_display_options m_range_option;
|
||||
string_type m_period_separator;
|
||||
string_type m_period_start_delimeter;
|
||||
string_type m_open_range_end_delimeter;
|
||||
string_type m_closed_range_end_delimeter;
|
||||
};
|
||||
|
||||
template <class CharT, class OutItrT>
|
||||
const typename period_formatter<CharT, OutItrT>::char_type
|
||||
template <class CharT, class OutItrT>
|
||||
const typename period_formatter<CharT, OutItrT>::char_type
|
||||
period_formatter<CharT, OutItrT>::default_period_separator[2] = {'/'};
|
||||
|
||||
template <class CharT, class OutItrT>
|
||||
const typename period_formatter<CharT, OutItrT>::char_type
|
||||
template <class CharT, class OutItrT>
|
||||
const typename period_formatter<CharT, OutItrT>::char_type
|
||||
period_formatter<CharT, OutItrT>::default_period_start_delimeter[2] = {'['};
|
||||
|
||||
template <class CharT, class OutItrT>
|
||||
const typename period_formatter<CharT, OutItrT>::char_type
|
||||
template <class CharT, class OutItrT>
|
||||
const typename period_formatter<CharT, OutItrT>::char_type
|
||||
period_formatter<CharT, OutItrT>::default_period_open_range_end_delimeter[2] = {')'};
|
||||
|
||||
template <class CharT, class OutItrT>
|
||||
const typename period_formatter<CharT, OutItrT>::char_type
|
||||
template <class CharT, class OutItrT>
|
||||
const typename period_formatter<CharT, OutItrT>::char_type
|
||||
period_formatter<CharT, OutItrT>::default_period_closed_range_end_delimeter[2] = {']'};
|
||||
|
||||
} } //namespace boost::date_time
|
||||
|
||||
@@ -3,14 +3,19 @@
|
||||
#define DATETIME_PERIOD_PARSER_HPP___
|
||||
|
||||
/* Copyright (c) 2002-2004 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
* Author: Jeff Garland, Bart Garst
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include <ios>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <iterator>
|
||||
#include <boost/throw_exception.hpp>
|
||||
#include <boost/date_time/special_defs.hpp>
|
||||
#include <boost/date_time/string_parse_tree.hpp>
|
||||
#include <boost/date_time/string_convert.hpp>
|
||||
|
||||
@@ -18,12 +23,12 @@
|
||||
namespace boost { namespace date_time {
|
||||
|
||||
|
||||
//! Not a facet, but a class used to specify and control period parsing
|
||||
//! Not a facet, but a class used to specify and control period parsing
|
||||
/*! Provides settings for the following:
|
||||
* - period_separator -- default '/'
|
||||
* - period_open_start_delimeter -- default '['
|
||||
* - period_open_range_end_delimeter -- default ')'
|
||||
* - period_closed_range_end_delimeter -- default ']'
|
||||
* - period_open_range_end_delimeter -- default ')'
|
||||
* - period_closed_range_end_delimeter -- default ']'
|
||||
* - display_as_open_range, display_as_closed_range -- default closed_range
|
||||
*
|
||||
* For a typical date_period, the contents of the input stream would be
|
||||
@@ -64,12 +69,6 @@ namespace boost { namespace date_time {
|
||||
delimiters.push_back(string_type(period_closed_range_end_delimeter));
|
||||
}
|
||||
|
||||
period_parser(const period_parser<date_type,CharT>& p_parser)
|
||||
{
|
||||
this->delimiters = p_parser.delimiters;
|
||||
this->m_range_option = p_parser.m_range_option;
|
||||
}
|
||||
|
||||
period_range_option range_option() const
|
||||
{
|
||||
return m_range_option;
|
||||
@@ -99,11 +98,11 @@ namespace boost { namespace date_time {
|
||||
* to get the 'elements'. For example, in the case of a date_period
|
||||
* the elements will be instances of a date which will be parsed
|
||||
* according the to setup in the passed facet parameter.
|
||||
*
|
||||
*
|
||||
* The steps for parsing a period are always the same:
|
||||
* - consume the start delimiter
|
||||
* - get start element
|
||||
* - consume the separator
|
||||
* - consume the separator
|
||||
* - get either last or end element depending on range settings
|
||||
* - consume the end delimeter depending on range settings
|
||||
*
|
||||
@@ -117,15 +116,15 @@ namespace boost { namespace date_time {
|
||||
*@endcode
|
||||
*/
|
||||
template<class period_type, class duration_type, class facet_type>
|
||||
period_type get_period(stream_itr_type& sitr,
|
||||
period_type get_period(stream_itr_type& sitr,
|
||||
stream_itr_type& stream_end,
|
||||
std::ios_base& a_ios,
|
||||
std::ios_base& a_ios,
|
||||
const period_type& /* p */,
|
||||
const duration_type& dur_unit,
|
||||
const facet_type& facet) const
|
||||
const facet_type& facet) const
|
||||
{
|
||||
// skip leading whitespace
|
||||
while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
|
||||
while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
|
||||
|
||||
typedef typename period_type::point_type point_type;
|
||||
point_type p1(not_a_date_time), p2(not_a_date_time);
|
||||
@@ -150,7 +149,7 @@ namespace boost { namespace date_time {
|
||||
}
|
||||
|
||||
private:
|
||||
collection_type delimiters;
|
||||
collection_type delimiters;
|
||||
period_range_option m_range_option;
|
||||
|
||||
enum delim_ids { SEPARATOR, START, OPEN_END, CLOSED_END };
|
||||
@@ -160,10 +159,10 @@ namespace boost { namespace date_time {
|
||||
stream_itr_type& stream_end,
|
||||
const string_type& delim) const
|
||||
{
|
||||
/* string_parse_tree will not parse a string of punctuation characters
|
||||
/* string_parse_tree will not parse a string of punctuation characters
|
||||
* without knowing exactly how many characters to process
|
||||
* Ex [2000. Will not parse out the '[' string without knowing
|
||||
* to process only one character. By using length of the delimiter
|
||||
* Ex [2000. Will not parse out the '[' string without knowing
|
||||
* to process only one character. By using length of the delimiter
|
||||
* string we can safely iterate past it. */
|
||||
string_type s;
|
||||
for(unsigned int i = 0; i < delim.length() && sitr != stream_end; ++i) {
|
||||
@@ -177,20 +176,20 @@ namespace boost { namespace date_time {
|
||||
}
|
||||
};
|
||||
|
||||
template <class date_type, class char_type>
|
||||
const typename period_parser<date_type, char_type>::char_type
|
||||
template <class date_type, class char_type>
|
||||
const typename period_parser<date_type, char_type>::char_type
|
||||
period_parser<date_type, char_type>::default_period_separator[2] = {'/'};
|
||||
|
||||
template <class date_type, class char_type>
|
||||
const typename period_parser<date_type, char_type>::char_type
|
||||
template <class date_type, class char_type>
|
||||
const typename period_parser<date_type, char_type>::char_type
|
||||
period_parser<date_type, char_type>::default_period_start_delimeter[2] = {'['};
|
||||
|
||||
template <class date_type, class char_type>
|
||||
const typename period_parser<date_type, char_type>::char_type
|
||||
template <class date_type, class char_type>
|
||||
const typename period_parser<date_type, char_type>::char_type
|
||||
period_parser<date_type, char_type>::default_period_open_range_end_delimeter[2] = {')'};
|
||||
|
||||
template <class date_type, class char_type>
|
||||
const typename period_parser<date_type, char_type>::char_type
|
||||
template <class date_type, class char_type>
|
||||
const typename period_parser<date_type, char_type>::char_type
|
||||
period_parser<date_type, char_type>::default_period_closed_range_end_delimeter[2] = {']'};
|
||||
|
||||
} } //namespace boost::date_time
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include <cstring>
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/date_time/posix_time/ptime.hpp>
|
||||
#include <boost/date_time/posix_time/posix_time_duration.hpp>
|
||||
#include <boost/date_time/filetime_functions.hpp>
|
||||
@@ -20,13 +22,18 @@ namespace boost {
|
||||
|
||||
namespace posix_time {
|
||||
|
||||
|
||||
//! Function that converts a time_t into a ptime.
|
||||
inline
|
||||
ptime from_time_t(std::time_t t)
|
||||
{
|
||||
ptime start(gregorian::date(1970,1,1));
|
||||
return start + seconds(static_cast<long>(t));
|
||||
return ptime(gregorian::date(1970,1,1)) + seconds(t);
|
||||
}
|
||||
|
||||
//! Function that converts a ptime into a time_t
|
||||
inline
|
||||
std::time_t to_time_t(ptime pt)
|
||||
{
|
||||
return (pt - ptime(gregorian::date(1970,1,1))).total_seconds();
|
||||
}
|
||||
|
||||
//! Convert a time to a tm structure truncating any fractional seconds
|
||||
@@ -34,19 +41,20 @@ namespace posix_time {
|
||||
std::tm to_tm(const boost::posix_time::ptime& t) {
|
||||
std::tm timetm = boost::gregorian::to_tm(t.date());
|
||||
boost::posix_time::time_duration td = t.time_of_day();
|
||||
timetm.tm_hour = td.hours();
|
||||
timetm.tm_min = td.minutes();
|
||||
timetm.tm_sec = td.seconds();
|
||||
timetm.tm_hour = static_cast<int>(td.hours());
|
||||
timetm.tm_min = static_cast<int>(td.minutes());
|
||||
timetm.tm_sec = static_cast<int>(td.seconds());
|
||||
timetm.tm_isdst = -1; // -1 used when dst info is unknown
|
||||
return timetm;
|
||||
}
|
||||
//! Convert a time_duration to a tm structure truncating any fractional seconds and zeroing fields for date components
|
||||
inline
|
||||
std::tm to_tm(const boost::posix_time::time_duration& td) {
|
||||
std::tm timetm = {};
|
||||
timetm.tm_hour = date_time::absolute_value(td.hours());
|
||||
timetm.tm_min = date_time::absolute_value(td.minutes());
|
||||
timetm.tm_sec = date_time::absolute_value(td.seconds());
|
||||
std::tm timetm;
|
||||
std::memset(&timetm, 0, sizeof(timetm));
|
||||
timetm.tm_hour = static_cast<int>(date_time::absolute_value(td.hours()));
|
||||
timetm.tm_min = static_cast<int>(date_time::absolute_value(td.minutes()));
|
||||
timetm.tm_sec = static_cast<int>(date_time::absolute_value(td.seconds()));
|
||||
timetm.tm_isdst = -1; // -1 used when dst info is unknown
|
||||
return timetm;
|
||||
}
|
||||
@@ -72,7 +80,7 @@ namespace posix_time {
|
||||
*
|
||||
* \note The function is templated on the FILETIME type, so that
|
||||
* it can be used with both native FILETIME and the ad-hoc
|
||||
* boost::date_time::winapi::file_time type.
|
||||
* boost::detail::winapi::FILETIME_ type.
|
||||
*/
|
||||
template< typename TimeT, typename FileTimeT >
|
||||
inline
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#ifndef DATE_DURATION_OPERATORS_HPP___
|
||||
#define DATE_DURATION_OPERATORS_HPP___
|
||||
|
||||
|
||||
/* Copyright (c) 2004 CrystalClear Software, Inc.
|
||||
* Subject to the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or
|
||||
@@ -26,7 +26,7 @@ namespace posix_time {
|
||||
/*! Adds a months object and a ptime. Result will be same
|
||||
* day-of-month as ptime unless original day was the last day of month.
|
||||
* see date_time::months_duration for more details */
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
ptime
|
||||
operator+(const ptime& t, const boost::gregorian::months& m)
|
||||
{
|
||||
@@ -36,7 +36,7 @@ namespace posix_time {
|
||||
/*! Adds a months object to a ptime. Result will be same
|
||||
* day-of-month as ptime unless original day was the last day of month.
|
||||
* see date_time::months_duration for more details */
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
ptime
|
||||
operator+=(ptime& t, const boost::gregorian::months& m)
|
||||
{
|
||||
@@ -47,7 +47,7 @@ namespace posix_time {
|
||||
/*! Subtracts a months object and a ptime. Result will be same
|
||||
* day-of-month as ptime unless original day was the last day of month.
|
||||
* see date_time::months_duration for more details */
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
ptime
|
||||
operator-(const ptime& t, const boost::gregorian::months& m)
|
||||
{
|
||||
@@ -58,7 +58,7 @@ namespace posix_time {
|
||||
/*! Subtracts a months object from a ptime. Result will be same
|
||||
* day-of-month as ptime unless original day was the last day of month.
|
||||
* see date_time::months_duration for more details */
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
ptime
|
||||
operator-=(ptime& t, const boost::gregorian::months& m)
|
||||
{
|
||||
@@ -70,7 +70,7 @@ namespace posix_time {
|
||||
/*! Adds a years object and a ptime. Result will be same
|
||||
* month and day-of-month as ptime unless original day was the
|
||||
* last day of month. see date_time::years_duration for more details */
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
ptime
|
||||
operator+(const ptime& t, const boost::gregorian::years& y)
|
||||
{
|
||||
@@ -80,7 +80,7 @@ namespace posix_time {
|
||||
/*! Adds a years object to a ptime. Result will be same
|
||||
* month and day-of-month as ptime unless original day was the
|
||||
* last day of month. see date_time::years_duration for more details */
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
ptime
|
||||
operator+=(ptime& t, const boost::gregorian::years& y)
|
||||
{
|
||||
@@ -90,7 +90,7 @@ namespace posix_time {
|
||||
/*! Subtracts a years object and a ptime. Result will be same
|
||||
* month and day-of-month as ptime unless original day was the
|
||||
* last day of month. see date_time::years_duration for more details */
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
ptime
|
||||
operator-(const ptime& t, const boost::gregorian::years& y)
|
||||
{
|
||||
@@ -101,7 +101,7 @@ namespace posix_time {
|
||||
/*! Subtracts a years object from a ptime. Result will be same
|
||||
* month and day-of-month as ptime unless original day was the
|
||||
* last day of month. see date_time::years_duration for more details */
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
ptime
|
||||
operator-=(ptime& t, const boost::gregorian::years& y)
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef POSIX_TIME_CONFIG_HPP___
|
||||
#define POSIX_TIME_CONFIG_HPP___
|
||||
|
||||
/* Copyright (c) 2002,2003,2005 CrystalClear Software, Inc.
|
||||
/* Copyright (c) 2002,2003,2005,2020 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
@@ -22,39 +22,26 @@
|
||||
namespace boost {
|
||||
namespace posix_time {
|
||||
|
||||
//Remove the following line if you want 64 bit millisecond resolution time
|
||||
//#define BOOST_GDTL_POSIX_TIME_STD_CONFIG
|
||||
|
||||
#ifdef BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
// set up conditional test compilations
|
||||
#define BOOST_DATE_TIME_HAS_MILLISECONDS
|
||||
#define BOOST_DATE_TIME_HAS_MICROSECONDS
|
||||
#define BOOST_DATE_TIME_HAS_NANOSECONDS
|
||||
typedef date_time::time_resolution_traits<boost::date_time::time_resolution_traits_adapted64_impl, boost::date_time::nano,
|
||||
1000000000, 9 > time_res_traits;
|
||||
#else
|
||||
// set up conditional test compilations
|
||||
#define BOOST_DATE_TIME_HAS_MILLISECONDS
|
||||
#define BOOST_DATE_TIME_HAS_MICROSECONDS
|
||||
#undef BOOST_DATE_TIME_HAS_NANOSECONDS
|
||||
typedef date_time::time_resolution_traits<
|
||||
boost::date_time::time_resolution_traits_adapted64_impl, boost::date_time::micro,
|
||||
1000000, 6 > time_res_traits;
|
||||
|
||||
|
||||
// #undef BOOST_DATE_TIME_HAS_MILLISECONDS
|
||||
// #undef BOOST_DATE_TIME_HAS_MICROSECONDS
|
||||
// #undef BOOST_DATE_TIME_HAS_NANOSECONDS
|
||||
// typedef date_time::time_resolution_traits<boost::int64_t, boost::date_time::tenth,
|
||||
// 10, 0 > time_res_traits;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
//! Base time duration type
|
||||
/*! \ingroup time_basics
|
||||
*/
|
||||
class time_duration :
|
||||
class BOOST_SYMBOL_VISIBLE time_duration :
|
||||
public date_time::time_duration<time_duration, time_res_traits>
|
||||
{
|
||||
public:
|
||||
@@ -66,23 +53,23 @@ namespace posix_time {
|
||||
typedef time_res_traits::fractional_seconds_type fractional_seconds_type;
|
||||
typedef time_res_traits::tick_type tick_type;
|
||||
typedef time_res_traits::impl_type impl_type;
|
||||
time_duration(hour_type hour,
|
||||
min_type min,
|
||||
sec_type sec,
|
||||
fractional_seconds_type fs=0) :
|
||||
BOOST_CXX14_CONSTEXPR time_duration(hour_type hour,
|
||||
min_type min,
|
||||
sec_type sec,
|
||||
fractional_seconds_type fs=0) :
|
||||
date_time::time_duration<time_duration, time_res_traits>(hour,min,sec,fs)
|
||||
{}
|
||||
time_duration() :
|
||||
BOOST_CXX14_CONSTEXPR time_duration() :
|
||||
date_time::time_duration<time_duration, time_res_traits>(0,0,0)
|
||||
{}
|
||||
//! Construct from special_values
|
||||
time_duration(boost::date_time::special_values sv) :
|
||||
BOOST_CXX14_CONSTEXPR time_duration(boost::date_time::special_values sv) :
|
||||
date_time::time_duration<time_duration, time_res_traits>(sv)
|
||||
{}
|
||||
//Give duration access to ticks constructor -- hide from users
|
||||
friend class date_time::time_duration<time_duration, time_res_traits>;
|
||||
private:
|
||||
explicit time_duration(impl_type tick_count) :
|
||||
protected:
|
||||
BOOST_CXX14_CONSTEXPR explicit time_duration(impl_type tick_count) :
|
||||
date_time::time_duration<time_duration, time_res_traits>(tick_count)
|
||||
{}
|
||||
};
|
||||
@@ -94,7 +81,7 @@ namespace posix_time {
|
||||
{
|
||||
typedef gregorian::date date_type;
|
||||
typedef time_duration time_duration_type;
|
||||
simple_time_rep(date_type d, time_duration_type tod) :
|
||||
BOOST_CXX14_CONSTEXPR simple_time_rep(date_type d, time_duration_type tod) :
|
||||
day(d),
|
||||
time_of_day(tod)
|
||||
{
|
||||
@@ -116,25 +103,25 @@ namespace posix_time {
|
||||
}
|
||||
date_type day;
|
||||
time_duration_type time_of_day;
|
||||
bool is_special()const
|
||||
BOOST_CXX14_CONSTEXPR bool is_special()const
|
||||
{
|
||||
return(is_pos_infinity() || is_neg_infinity() || is_not_a_date_time());
|
||||
}
|
||||
bool is_pos_infinity()const
|
||||
BOOST_CXX14_CONSTEXPR bool is_pos_infinity()const
|
||||
{
|
||||
return(day.is_pos_infinity() || time_of_day.is_pos_infinity());
|
||||
}
|
||||
bool is_neg_infinity()const
|
||||
BOOST_CXX14_CONSTEXPR bool is_neg_infinity()const
|
||||
{
|
||||
return(day.is_neg_infinity() || time_of_day.is_neg_infinity());
|
||||
}
|
||||
bool is_not_a_date_time()const
|
||||
BOOST_CXX14_CONSTEXPR bool is_not_a_date_time()const
|
||||
{
|
||||
return(day.is_not_a_date() || time_of_day.is_not_a_date_time());
|
||||
}
|
||||
};
|
||||
|
||||
class posix_time_system_config
|
||||
class BOOST_SYMBOL_VISIBLE posix_time_system_config
|
||||
{
|
||||
public:
|
||||
typedef simple_time_rep time_rep_type;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef POSIX_TIME_DURATION_HPP___
|
||||
#define POSIX_TIME_DURATION_HPP___
|
||||
|
||||
/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
|
||||
/* Copyright (c) 2002,2003, 2020 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
@@ -9,41 +9,54 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include "boost/date_time/posix_time/posix_time_config.hpp"
|
||||
#include <boost/core/enable_if.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/posix_time/posix_time_config.hpp>
|
||||
#include <boost/numeric/conversion/cast.hpp>
|
||||
#include <boost/type_traits/is_integral.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace posix_time {
|
||||
|
||||
//! Allows expression of durations as an hour count
|
||||
//! The argument must be an integral type
|
||||
/*! \ingroup time_basics
|
||||
*/
|
||||
class hours : public time_duration
|
||||
class BOOST_SYMBOL_VISIBLE hours : public time_duration
|
||||
{
|
||||
public:
|
||||
explicit hours(long h) :
|
||||
time_duration(h,0,0)
|
||||
template <typename T>
|
||||
BOOST_CXX14_CONSTEXPR explicit hours(T const& h,
|
||||
typename boost::enable_if<boost::is_integral<T>, void>::type* = BOOST_DATE_TIME_NULLPTR) :
|
||||
time_duration(numeric_cast<hour_type>(h), 0, 0)
|
||||
{}
|
||||
};
|
||||
|
||||
//! Allows expression of durations as a minute count
|
||||
//! The argument must be an integral type
|
||||
/*! \ingroup time_basics
|
||||
*/
|
||||
class minutes : public time_duration
|
||||
class BOOST_SYMBOL_VISIBLE minutes : public time_duration
|
||||
{
|
||||
public:
|
||||
explicit minutes(long m) :
|
||||
time_duration(0,m,0)
|
||||
template <typename T>
|
||||
BOOST_CXX14_CONSTEXPR explicit minutes(T const& m,
|
||||
typename boost::enable_if<boost::is_integral<T>, void>::type* = BOOST_DATE_TIME_NULLPTR) :
|
||||
time_duration(0, numeric_cast<min_type>(m),0)
|
||||
{}
|
||||
};
|
||||
|
||||
//! Allows expression of durations as a seconds count
|
||||
//! The argument must be an integral type
|
||||
/*! \ingroup time_basics
|
||||
*/
|
||||
class seconds : public time_duration
|
||||
class BOOST_SYMBOL_VISIBLE seconds : public time_duration
|
||||
{
|
||||
public:
|
||||
explicit seconds(long s) :
|
||||
time_duration(0,0,s)
|
||||
template <typename T>
|
||||
BOOST_CXX14_CONSTEXPR explicit seconds(T const& s,
|
||||
typename boost::enable_if<boost::is_integral<T>, void>::type* = BOOST_DATE_TIME_NULLPTR) :
|
||||
time_duration(0,0, numeric_cast<sec_type>(s))
|
||||
{}
|
||||
};
|
||||
|
||||
@@ -69,12 +82,8 @@ namespace posix_time {
|
||||
typedef date_time::subsecond_duration<time_duration,1000000000> nanosec;
|
||||
typedef date_time::subsecond_duration<time_duration,1000000000> nanoseconds;
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
} }//namespace posix_time
|
||||
|
||||
|
||||
|
||||
@@ -47,7 +47,6 @@ namespace posix_time {
|
||||
const ptime& p) {
|
||||
boost::io::ios_flags_saver iflags(os);
|
||||
typedef boost::date_time::time_facet<ptime, CharT> custom_ptime_facet;
|
||||
typedef std::time_put<CharT> std_ptime_facet;
|
||||
std::ostreambuf_iterator<CharT> oitr(os);
|
||||
if (std::has_facet<custom_ptime_facet>(os.getloc()))
|
||||
std::use_facet<custom_ptime_facet>(os.getloc()).put(oitr, os, os.fill(), p);
|
||||
@@ -75,13 +74,13 @@ namespace posix_time {
|
||||
typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
|
||||
if (strm_sentry) {
|
||||
try {
|
||||
typedef typename date_time::time_input_facet<ptime, CharT> time_input_facet;
|
||||
typedef typename date_time::time_input_facet<ptime, CharT> time_input_facet_local;
|
||||
std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
|
||||
if(std::has_facet<time_input_facet>(is.getloc())) {
|
||||
std::use_facet<time_input_facet>(is.getloc()).get(sit, str_end, is, pt);
|
||||
if(std::has_facet<time_input_facet_local>(is.getloc())) {
|
||||
std::use_facet<time_input_facet_local>(is.getloc()).get(sit, str_end, is, pt);
|
||||
}
|
||||
else {
|
||||
time_input_facet* f = new time_input_facet();
|
||||
time_input_facet_local* f = new time_input_facet_local();
|
||||
std::locale l = std::locale(is.getloc(), f);
|
||||
is.imbue(l);
|
||||
f->get(sit, str_end, is, pt);
|
||||
@@ -98,7 +97,7 @@ namespace posix_time {
|
||||
throw; // rethrow original exception
|
||||
}
|
||||
else {
|
||||
// if the user want's to fail quietly, we simply set the failbit
|
||||
// if the user wants to fail quietly, we simply set the failbit
|
||||
is.setstate(std::ios_base::failbit);
|
||||
}
|
||||
}
|
||||
@@ -114,7 +113,6 @@ namespace posix_time {
|
||||
const boost::posix_time::time_period& p) {
|
||||
boost::io::ios_flags_saver iflags(os);
|
||||
typedef boost::date_time::time_facet<ptime, CharT> custom_ptime_facet;
|
||||
typedef std::time_put<CharT> std_time_facet;
|
||||
std::ostreambuf_iterator<CharT> oitr(os);
|
||||
if (std::has_facet<custom_ptime_facet>(os.getloc())) {
|
||||
std::use_facet<custom_ptime_facet>(os.getloc()).put(oitr, os, os.fill(), p);
|
||||
@@ -143,13 +141,13 @@ namespace posix_time {
|
||||
typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
|
||||
if (strm_sentry) {
|
||||
try {
|
||||
typedef typename date_time::time_input_facet<ptime, CharT> time_input_facet;
|
||||
typedef typename date_time::time_input_facet<ptime, CharT> time_input_facet_local;
|
||||
std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
|
||||
if(std::has_facet<time_input_facet>(is.getloc())) {
|
||||
std::use_facet<time_input_facet>(is.getloc()).get(sit, str_end, is, tp);
|
||||
if(std::has_facet<time_input_facet_local>(is.getloc())) {
|
||||
std::use_facet<time_input_facet_local>(is.getloc()).get(sit, str_end, is, tp);
|
||||
}
|
||||
else {
|
||||
time_input_facet* f = new time_input_facet();
|
||||
time_input_facet_local* f = new time_input_facet_local();
|
||||
std::locale l = std::locale(is.getloc(), f);
|
||||
is.imbue(l);
|
||||
f->get(sit, str_end, is, tp);
|
||||
@@ -180,7 +178,6 @@ namespace posix_time {
|
||||
{
|
||||
boost::io::ios_flags_saver iflags(os);
|
||||
typedef boost::date_time::time_facet<ptime, CharT> custom_ptime_facet;
|
||||
typedef std::time_put<CharT> std_ptime_facet;
|
||||
std::ostreambuf_iterator<CharT> oitr(os);
|
||||
if (std::has_facet<custom_ptime_facet>(os.getloc()))
|
||||
std::use_facet<custom_ptime_facet>(os.getloc()).put(oitr, os, os.fill(), td);
|
||||
@@ -208,13 +205,13 @@ namespace posix_time {
|
||||
typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
|
||||
if (strm_sentry) {
|
||||
try {
|
||||
typedef typename date_time::time_input_facet<ptime, CharT> time_input_facet;
|
||||
typedef typename date_time::time_input_facet<ptime, CharT> time_input_facet_local;
|
||||
std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
|
||||
if(std::has_facet<time_input_facet>(is.getloc())) {
|
||||
std::use_facet<time_input_facet>(is.getloc()).get(sit, str_end, is, td);
|
||||
if(std::has_facet<time_input_facet_local>(is.getloc())) {
|
||||
std::use_facet<time_input_facet_local>(is.getloc()).get(sit, str_end, is, td);
|
||||
}
|
||||
else {
|
||||
time_input_facet* f = new time_input_facet();
|
||||
time_input_facet_local* f = new time_input_facet_local();
|
||||
std::locale l = std::locale(is.getloc(), f);
|
||||
is.imbue(l);
|
||||
f->get(sit, str_end, is, td);
|
||||
|
||||
@@ -80,7 +80,7 @@ namespace posix_time {
|
||||
// any marker (such as '\0').
|
||||
typename std::basic_string<charT>::iterator e = inp_s.end();
|
||||
while(b != e){
|
||||
out_ss << out_ss.narrow(*b, 0);
|
||||
out_ss << is.narrow(*b, 0);
|
||||
++b;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,8 +9,9 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include "boost/date_time/posix_time/posix_time_system.hpp"
|
||||
#include "boost/date_time/time.hpp"
|
||||
#include <boost/date_time/posix_time/posix_time_system.hpp>
|
||||
#include <boost/date_time/time.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
|
||||
namespace boost {
|
||||
|
||||
@@ -24,11 +25,11 @@ namespace posix_time {
|
||||
using date_time::not_a_date_time;
|
||||
using date_time::max_date_time;
|
||||
using date_time::min_date_time;
|
||||
|
||||
|
||||
//! Time type with no timezone or other adjustments
|
||||
/*! \ingroup time_basics
|
||||
*/
|
||||
class ptime : public date_time::base_time<ptime, posix_time_system>
|
||||
class BOOST_SYMBOL_VISIBLE ptime : public date_time::base_time<ptime, posix_time_system>
|
||||
{
|
||||
public:
|
||||
typedef posix_time_system time_system_type;
|
||||
@@ -36,26 +37,44 @@ namespace posix_time {
|
||||
typedef time_system_type::time_duration_type time_duration_type;
|
||||
typedef ptime time_type;
|
||||
//! Construct with date and offset in day
|
||||
ptime(gregorian::date d,time_duration_type td) : date_time::base_time<time_type,time_system_type>(d,td)
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
ptime(gregorian::date d,time_duration_type td) :
|
||||
date_time::base_time<time_type,time_system_type>(d,td)
|
||||
{}
|
||||
//! Construct a time at start of the given day (midnight)
|
||||
explicit ptime(gregorian::date d) : date_time::base_time<time_type,time_system_type>(d,time_duration_type(0,0,0))
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
explicit ptime(gregorian::date d) :
|
||||
date_time::base_time<time_type,time_system_type>(d,time_duration_type(0,0,0))
|
||||
{}
|
||||
//! Copy from time_rep
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
ptime(const time_rep_type& rhs):
|
||||
date_time::base_time<time_type,time_system_type>(rhs)
|
||||
{}
|
||||
//! Construct from special value
|
||||
ptime(const special_values sv) : date_time::base_time<time_type,time_system_type>(sv)
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
ptime(const special_values sv) :
|
||||
date_time::base_time<time_type,time_system_type>(sv)
|
||||
{}
|
||||
#if !defined(DATE_TIME_NO_DEFAULT_CONSTRUCTOR)
|
||||
// Default constructor constructs to not_a_date_time
|
||||
ptime() : date_time::base_time<time_type,time_system_type>(gregorian::date(not_a_date_time), time_duration_type(not_a_date_time))
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
ptime() :
|
||||
date_time::base_time<time_type,time_system_type>(gregorian::date(not_a_date_time),
|
||||
time_duration_type(not_a_date_time))
|
||||
{}
|
||||
#endif // DATE_TIME_NO_DEFAULT_CONSTRUCTOR
|
||||
|
||||
|
||||
friend BOOST_CXX14_CONSTEXPR
|
||||
bool operator==(const ptime& lhs, const ptime& rhs);
|
||||
|
||||
};
|
||||
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
bool operator==(const ptime& lhs, const ptime& rhs)
|
||||
{
|
||||
return ptime::time_system_type::is_equal(lhs.time_,rhs.time_);
|
||||
}
|
||||
|
||||
|
||||
} }//namespace posix_time
|
||||
|
||||
@@ -157,7 +157,7 @@ namespace posix_time {
|
||||
}// else
|
||||
return ss.str();
|
||||
}
|
||||
//! Time duration in iso format -hhmmss,fffffff Example: 10:09:03,0123456
|
||||
//! Time duration in ISO 8601 format -hhmmss.fffffff. Example: 10:09:03.0123456
|
||||
/*!\ingroup time_format
|
||||
*/
|
||||
inline std::string to_iso_string(time_duration td){
|
||||
@@ -215,7 +215,7 @@ namespace posix_time {
|
||||
return ts;
|
||||
}
|
||||
}
|
||||
//! Convert iso short form YYYYMMDDTHHMMSS where T is the date-time separator
|
||||
//! Convert ISO 8601 short form YYYYMMDDTHHMMSS where T is the date-time separator
|
||||
/*!\ingroup time_format
|
||||
*/
|
||||
inline std::string to_iso_string(ptime t){
|
||||
@@ -251,7 +251,7 @@ namespace posix_time {
|
||||
inline std::wstring to_simple_wstring(time_duration td) {
|
||||
return to_simple_string_type<wchar_t>(td);
|
||||
}
|
||||
//! Time duration in iso format -hhmmss,fffffff Example: 10:09:03,0123456
|
||||
//! Time duration in ISO 8601 format -hhmmss.fffffff. Example: 10:09:03.0123456
|
||||
/*!\ingroup time_format
|
||||
*/
|
||||
inline std::wstring to_iso_wstring(time_duration td){
|
||||
@@ -266,7 +266,7 @@ namespace posix_time {
|
||||
inline std::wstring to_simple_wstring(time_period tp){
|
||||
return to_simple_string_type<wchar_t>(tp);
|
||||
}
|
||||
//! Convert iso short form YYYYMMDDTHHMMSS where T is the date-time separator
|
||||
//! Convert ISO 8601 short form YYYYMMDDTHHMMSS where T is the date-time separator
|
||||
/*!\ingroup time_format
|
||||
*/
|
||||
inline std::wstring to_iso_wstring(ptime t){
|
||||
|
||||
@@ -82,7 +82,7 @@ namespace posix_time {
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
//! Time duration in iso format -hhmmss,fffffff Example: 10:09:03,0123456
|
||||
//! Time duration in ISO 8601 format -hhmmss.fffffff. Example: 10:09:03.0123456
|
||||
/*!\ingroup time_format
|
||||
*/
|
||||
inline
|
||||
@@ -173,7 +173,7 @@ namespace posix_time {
|
||||
return std::string("[" + d1 + "/" + d2 +"]");
|
||||
}
|
||||
|
||||
//! Convert iso short form YYYYMMDDTHHMMSS where T is the date-time separator
|
||||
//! Convert ISO 8601 short form YYYYMMDDTHHMMSS where T is the date-time separator
|
||||
/*!\ingroup time_format
|
||||
*/
|
||||
inline
|
||||
|
||||
@@ -35,6 +35,14 @@ namespace posix_time {
|
||||
return date_time::parse_iso_time<ptime>(s, 'T');
|
||||
}
|
||||
|
||||
inline ptime from_iso_extended_string(const std::string& s) {
|
||||
if (s.size() == 10) { //assume we just have a date which is 10 chars
|
||||
gregorian::date d = gregorian::from_simple_string(s);
|
||||
return ptime( d );
|
||||
}
|
||||
return date_time::parse_delimited_time<ptime>(s, 'T');
|
||||
}
|
||||
|
||||
|
||||
|
||||
} } //namespace posix_time
|
||||
|
||||
@@ -11,19 +11,45 @@
|
||||
|
||||
#include "boost/date_time/posix_time/posix_time.hpp"
|
||||
#include "boost/date_time/gregorian/greg_serialize.hpp"
|
||||
#include "boost/serialization/split_free.hpp"
|
||||
#include "boost/core/nvp.hpp"
|
||||
#include "boost/numeric/conversion/cast.hpp"
|
||||
#include "boost/type_traits/integral_constant.hpp"
|
||||
|
||||
|
||||
// macros to split serialize functions into save & load functions
|
||||
// NOTE: these macros define template functions in the boost::serialization namespace.
|
||||
// They must be expanded *outside* of any namespace
|
||||
BOOST_SERIALIZATION_SPLIT_FREE(boost::posix_time::ptime)
|
||||
BOOST_SERIALIZATION_SPLIT_FREE(boost::posix_time::time_duration)
|
||||
BOOST_SERIALIZATION_SPLIT_FREE(boost::posix_time::time_period)
|
||||
// Define versions for serialization compatibility
|
||||
// alows the unit tests to make an older version to check compatibility
|
||||
#ifndef BOOST_DATE_TIME_POSIX_TIME_DURATION_VERSION
|
||||
#define BOOST_DATE_TIME_POSIX_TIME_DURATION_VERSION 1
|
||||
#endif
|
||||
|
||||
namespace boost {
|
||||
namespace serialization {
|
||||
|
||||
template<typename T>
|
||||
struct version;
|
||||
|
||||
template<>
|
||||
struct version<boost::posix_time::time_duration>
|
||||
: integral_constant<int, BOOST_DATE_TIME_POSIX_TIME_DURATION_VERSION>
|
||||
{
|
||||
};
|
||||
|
||||
// A macro to split serialize functions into save & load functions.
|
||||
// It is here to avoid dependency on Boost.Serialization just for the
|
||||
// BOOST_SERIALIZATION_SPLIT_FREE macro
|
||||
#define BOOST_DATE_TIME_SPLIT_FREE(T) \
|
||||
template<class Archive> \
|
||||
inline void serialize(Archive & ar, \
|
||||
T & t, \
|
||||
const unsigned int file_version) \
|
||||
{ \
|
||||
split_free(ar, t, file_version); \
|
||||
}
|
||||
|
||||
BOOST_DATE_TIME_SPLIT_FREE(boost::posix_time::ptime)
|
||||
BOOST_DATE_TIME_SPLIT_FREE(boost::posix_time::time_duration)
|
||||
BOOST_DATE_TIME_SPLIT_FREE(boost::posix_time::time_period)
|
||||
|
||||
#undef BOOST_DATE_TIME_SPLIT_FREE
|
||||
|
||||
/*** time_duration ***/
|
||||
|
||||
@@ -32,10 +58,23 @@ namespace serialization {
|
||||
* types are hour_type, min_type, sec_type, and fractional_seconds_type
|
||||
* as defined in the time_duration class
|
||||
*/
|
||||
template<class TimeResTraitsSize, class Archive>
|
||||
void save_td(Archive& ar, const posix_time::time_duration& td)
|
||||
{
|
||||
TimeResTraitsSize h = boost::numeric_cast<TimeResTraitsSize>(td.hours());
|
||||
TimeResTraitsSize m = boost::numeric_cast<TimeResTraitsSize>(td.minutes());
|
||||
TimeResTraitsSize s = boost::numeric_cast<TimeResTraitsSize>(td.seconds());
|
||||
posix_time::time_duration::fractional_seconds_type fs = td.fractional_seconds();
|
||||
ar & make_nvp("time_duration_hours", h);
|
||||
ar & make_nvp("time_duration_minutes", m);
|
||||
ar & make_nvp("time_duration_seconds", s);
|
||||
ar & make_nvp("time_duration_fractional_seconds", fs);
|
||||
}
|
||||
|
||||
template<class Archive>
|
||||
void save(Archive & ar,
|
||||
const posix_time::time_duration& td,
|
||||
unsigned int /*version*/)
|
||||
unsigned int version)
|
||||
{
|
||||
// serialize a bool so we know how to read this back in later
|
||||
bool is_special = td.is_special();
|
||||
@@ -45,14 +84,13 @@ void save(Archive & ar,
|
||||
ar & make_nvp("sv_time_duration", s);
|
||||
}
|
||||
else {
|
||||
typename posix_time::time_duration::hour_type h = td.hours();
|
||||
typename posix_time::time_duration::min_type m = td.minutes();
|
||||
typename posix_time::time_duration::sec_type s = td.seconds();
|
||||
typename posix_time::time_duration::fractional_seconds_type fs = td.fractional_seconds();
|
||||
ar & make_nvp("time_duration_hours", h);
|
||||
ar & make_nvp("time_duration_minutes", m);
|
||||
ar & make_nvp("time_duration_seconds", s);
|
||||
ar & make_nvp("time_duration_fractional_seconds", fs);
|
||||
// Write support for earlier versions allows for upgrade compatibility testing
|
||||
// See load comments for version information
|
||||
if (version == 0) {
|
||||
save_td<int32_t>(ar, td);
|
||||
} else {
|
||||
save_td<int64_t>(ar, td);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,10 +99,24 @@ void save(Archive & ar,
|
||||
* types are hour_type, min_type, sec_type, and fractional_seconds_type
|
||||
* as defined in the time_duration class
|
||||
*/
|
||||
template<class TimeResTraitsSize, class Archive>
|
||||
void load_td(Archive& ar, posix_time::time_duration& td)
|
||||
{
|
||||
TimeResTraitsSize h(0);
|
||||
TimeResTraitsSize m(0);
|
||||
TimeResTraitsSize s(0);
|
||||
posix_time::time_duration::fractional_seconds_type fs(0);
|
||||
ar & make_nvp("time_duration_hours", h);
|
||||
ar & make_nvp("time_duration_minutes", m);
|
||||
ar & make_nvp("time_duration_seconds", s);
|
||||
ar & make_nvp("time_duration_fractional_seconds", fs);
|
||||
td = posix_time::time_duration(h, m, s, fs);
|
||||
}
|
||||
|
||||
template<class Archive>
|
||||
void load(Archive & ar,
|
||||
posix_time::time_duration & td,
|
||||
unsigned int /*version*/)
|
||||
unsigned int version)
|
||||
{
|
||||
bool is_special = false;
|
||||
ar & make_nvp("is_special", is_special);
|
||||
@@ -75,15 +127,25 @@ void load(Archive & ar,
|
||||
td = posix_time::time_duration(sv);
|
||||
}
|
||||
else {
|
||||
typename posix_time::time_duration::hour_type h(0);
|
||||
typename posix_time::time_duration::min_type m(0);
|
||||
typename posix_time::time_duration::sec_type s(0);
|
||||
typename posix_time::time_duration::fractional_seconds_type fs(0);
|
||||
ar & make_nvp("time_duration_hours", h);
|
||||
ar & make_nvp("time_duration_minutes", m);
|
||||
ar & make_nvp("time_duration_seconds", s);
|
||||
ar & make_nvp("time_duration_fractional_seconds", fs);
|
||||
td = posix_time::time_duration(h,m,s,fs);
|
||||
// Version "0" (Boost 1.65.1 or earlier, which used int32_t for day/hour/minute/second and
|
||||
// therefore suffered from the year 2038 issue.)
|
||||
// Version "0.5" (Boost 1.66.0 changed to std::time_t but did not increase the version;
|
||||
// it was missed in the original change, all code reviews, and there were no
|
||||
// static assertions to protect the code; further std::time_t can be 32-bit
|
||||
// or 64-bit so it reduced portability. This makes 1.66.0 hard to handle...)
|
||||
// Version "1" (Boost 1.67.0 or later uses int64_t and is properly versioned)
|
||||
|
||||
// If the size of any of these items changes, a new version is needed.
|
||||
BOOST_STATIC_ASSERT(sizeof(posix_time::time_duration::hour_type) == sizeof(boost::int64_t));
|
||||
BOOST_STATIC_ASSERT(sizeof(posix_time::time_duration::min_type) == sizeof(boost::int64_t));
|
||||
BOOST_STATIC_ASSERT(sizeof(posix_time::time_duration::sec_type) == sizeof(boost::int64_t));
|
||||
BOOST_STATIC_ASSERT(sizeof(posix_time::time_duration::fractional_seconds_type) == sizeof(boost::int64_t));
|
||||
|
||||
if (version == 0) {
|
||||
load_td<int32_t>(ar, td);
|
||||
} else {
|
||||
load_td<int64_t>(ar, td);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,10 +165,10 @@ void save(Archive & ar,
|
||||
{
|
||||
// from_iso_string does not include fractional seconds
|
||||
// therefore date and time_duration are used
|
||||
typename posix_time::ptime::date_type d = pt.date();
|
||||
posix_time::ptime::date_type d = pt.date();
|
||||
ar & make_nvp("ptime_date", d);
|
||||
if(!pt.is_special()) {
|
||||
typename posix_time::ptime::time_duration_type td = pt.time_of_day();
|
||||
posix_time::ptime::time_duration_type td = pt.time_of_day();
|
||||
ar & make_nvp("ptime_time_duration", td);
|
||||
}
|
||||
}
|
||||
@@ -122,8 +184,8 @@ void load(Archive & ar,
|
||||
{
|
||||
// from_iso_string does not include fractional seconds
|
||||
// therefore date and time_duration are used
|
||||
typename posix_time::ptime::date_type d(posix_time::not_a_date_time);
|
||||
typename posix_time::ptime::time_duration_type td;
|
||||
posix_time::ptime::date_type d(posix_time::not_a_date_time);
|
||||
posix_time::ptime::time_duration_type td;
|
||||
ar & make_nvp("ptime_date", d);
|
||||
if(!d.is_special()) {
|
||||
ar & make_nvp("ptime_time_duration", td);
|
||||
@@ -137,7 +199,7 @@ void load(Archive & ar,
|
||||
|
||||
//!override needed b/c no default constructor
|
||||
template<class Archive>
|
||||
inline void load_construct_data(Archive & ar,
|
||||
inline void load_construct_data(Archive & /*ar*/,
|
||||
posix_time::ptime* pt,
|
||||
const unsigned int /*file_version*/)
|
||||
{
|
||||
@@ -183,7 +245,7 @@ void load(Archive & ar,
|
||||
|
||||
//!override needed b/c no default constructor
|
||||
template<class Archive>
|
||||
inline void load_construct_data(Archive & ar,
|
||||
inline void load_construct_data(Archive & /*ar*/,
|
||||
boost::posix_time::time_period* tp,
|
||||
const unsigned int /*file_version*/)
|
||||
{
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <iterator>
|
||||
#include "boost/date_time/special_defs.hpp"
|
||||
|
||||
namespace boost { namespace date_time {
|
||||
|
||||
@@ -34,14 +34,9 @@ namespace boost { namespace date_time {
|
||||
{
|
||||
public:
|
||||
typedef std::basic_string<charT> string_type;
|
||||
//typedef std::basic_stringstream<charT> stringstream_type;
|
||||
typedef std::basic_stringstream<charT> stringstream_type;
|
||||
typedef std::istreambuf_iterator<charT> stream_itr_type;
|
||||
//typedef typename string_type::const_iterator const_itr;
|
||||
//typedef typename date_type::year_type year_type;
|
||||
//typedef typename date_type::month_type month_type;
|
||||
typedef typename date_type::duration_type duration_type;
|
||||
//typedef typename date_type::day_of_week_type day_of_week_type;
|
||||
//typedef typename date_type::day_type day_type;
|
||||
typedef string_parse_tree<charT> parse_tree_type;
|
||||
typedef typename parse_tree_type::parse_match_result_type match_results;
|
||||
typedef std::vector<std::basic_string<charT> > collection_type;
|
||||
@@ -80,11 +75,6 @@ namespace boost { namespace date_time {
|
||||
m_sv_strings = parse_tree_type(phrases, static_cast<int>(not_a_date_time));
|
||||
}
|
||||
|
||||
special_values_parser(const special_values_parser<date_type,charT>& svp)
|
||||
{
|
||||
this->m_sv_strings = svp.m_sv_strings;
|
||||
}
|
||||
|
||||
//! Replace special value strings
|
||||
void sv_strings(const string_type& nadt_str,
|
||||
const string_type& neg_inf_str,
|
||||
@@ -101,11 +91,37 @@ namespace boost { namespace date_time {
|
||||
m_sv_strings = parse_tree_type(phrases, static_cast<int>(not_a_date_time));
|
||||
}
|
||||
|
||||
/* Does not return a special_value because if the parsing fails,
|
||||
* the return value will always be not_a_date_time
|
||||
* (mr.current_match retains its default value of -1 on a failed
|
||||
* parse and that casts to not_a_date_time). */
|
||||
//! Sets match_results.current_match to the corresponding special_value or -1
|
||||
//! The parser is expensive to create, and not thread-safe so it cannot be static
|
||||
//! therefore given a string, determine if it is likely to be a special value.
|
||||
//! A negative response is a definite no, whereas a positive is only likely and
|
||||
//! match() should be called and return value checked.
|
||||
//! \param[in] str the string to check
|
||||
//! \returns false if it is definitely not a special value
|
||||
static bool should_call_match(const string_type& str)
|
||||
{
|
||||
if (!str.empty()) {
|
||||
switch (str[0]) {
|
||||
// See string definitions at the end of this class..
|
||||
case '+':
|
||||
case '-':
|
||||
case 'n':
|
||||
case 'm':
|
||||
return true;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//! Given an input iterator, attempt to match it to a known special value
|
||||
//! \param[in] sitr the start iterator
|
||||
//! \param[in] str_end the end iterator
|
||||
//! \param[out] mr the match result:
|
||||
//! mr.current_match is set to the corresponding special_value or -1
|
||||
//! \returns whether something matched
|
||||
bool match(stream_itr_type& sitr,
|
||||
stream_itr_type& str_end,
|
||||
match_results& mr) const
|
||||
@@ -114,18 +130,6 @@ namespace boost { namespace date_time {
|
||||
m_sv_strings.match(sitr, str_end, mr, level);
|
||||
return (mr.current_match != match_results::PARSE_ERROR);
|
||||
}
|
||||
/*special_values match(stream_itr_type& sitr,
|
||||
stream_itr_type& str_end,
|
||||
match_results& mr) const
|
||||
{
|
||||
unsigned int level = 0;
|
||||
m_sv_strings.match(sitr, str_end, mr, level);
|
||||
if(mr.current_match == match_results::PARSE_ERROR) {
|
||||
throw std::ios_base::failure("Parse failed. No match found for '" + mr.cache + "'");
|
||||
}
|
||||
return static_cast<special_values>(mr.current_match);
|
||||
}*/
|
||||
|
||||
|
||||
private:
|
||||
parse_tree_type m_sv_strings;
|
||||
|
||||
@@ -21,7 +21,6 @@ namespace date_time {
|
||||
inline
|
||||
std::basic_string<OutputT> convert_string_type(const std::basic_string<InputT>& inp_str)
|
||||
{
|
||||
typedef std::basic_string<InputT> input_type;
|
||||
typedef std::basic_string<OutputT> output_type;
|
||||
output_type result;
|
||||
result.insert(result.begin(), inp_str.begin(), inp_str.end());
|
||||
|
||||
@@ -10,11 +10,13 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "boost/lexical_cast.hpp" //error without?
|
||||
#include "boost/algorithm/string/case_conv.hpp"
|
||||
#include <boost/algorithm/string/case_conv.hpp>
|
||||
#include <cctype>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <ostream>
|
||||
#include <iterator>
|
||||
#include <algorithm>
|
||||
|
||||
namespace boost { namespace date_time {
|
||||
@@ -25,7 +27,7 @@ struct parse_match_result
|
||||
{
|
||||
parse_match_result() :
|
||||
match_depth(0),
|
||||
current_match(-1)// -1 is match_not-found value
|
||||
current_match(PARSE_ERROR)
|
||||
{}
|
||||
typedef std::basic_string<charT> string_type;
|
||||
string_type remaining() const
|
||||
@@ -33,7 +35,7 @@ struct parse_match_result
|
||||
if (match_depth == cache.size()) {
|
||||
return string_type();
|
||||
}
|
||||
if (current_match == -1) {
|
||||
if (current_match == PARSE_ERROR) {
|
||||
return cache;
|
||||
}
|
||||
//some of the cache was used return the rest
|
||||
@@ -56,7 +58,7 @@ struct parse_match_result
|
||||
string_type cache;
|
||||
unsigned short match_depth;
|
||||
short current_match;
|
||||
enum PARSE_STATE { PARSE_ERROR= -1 };
|
||||
enum PARSE_STATE { PARSE_ERROR = -1 };
|
||||
};
|
||||
|
||||
//for debug -- really only char streams...
|
||||
@@ -82,7 +84,7 @@ operator<<(std::basic_ostream<charT>& os, parse_match_result<charT>& mr)
|
||||
template<typename charT>
|
||||
struct string_parse_tree
|
||||
{
|
||||
#if BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x581) )
|
||||
#if BOOST_WORKAROUND( BOOST_BORLANDC, BOOST_TESTED_AT(0x581) )
|
||||
typedef std::multimap<charT, string_parse_tree< charT> > ptree_coll;
|
||||
#else
|
||||
typedef std::multimap<charT, string_parse_tree > ptree_coll;
|
||||
@@ -99,7 +101,8 @@ struct string_parse_tree
|
||||
* (Sun=0, Mon=1, ...) were a starting_point of one starts the
|
||||
* numbering at one (Jan=1, Feb=2, ...). The default is zero,
|
||||
* negative vaules are not allowed */
|
||||
string_parse_tree(collection_type names, unsigned int starting_point=0)
|
||||
string_parse_tree(collection_type names, unsigned int starting_point=0) :
|
||||
m_value(parse_match_result_type::PARSE_ERROR)
|
||||
{
|
||||
// iterate thru all the elements and build the tree
|
||||
unsigned short index = 0;
|
||||
@@ -113,7 +116,7 @@ struct string_parse_tree
|
||||
}
|
||||
|
||||
|
||||
string_parse_tree(short value = -1) :
|
||||
string_parse_tree(short value = parse_match_result_type::PARSE_ERROR) :
|
||||
m_value(value)
|
||||
{}
|
||||
ptree_coll m_next_chars;
|
||||
|
||||
@@ -9,10 +9,12 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include <cstring>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <locale>
|
||||
#include <iterator>
|
||||
|
||||
namespace boost { namespace date_time {
|
||||
|
||||
@@ -35,7 +37,6 @@ gather_month_strings(const std::locale& locale, bool short_strings=true)
|
||||
{
|
||||
typedef std::basic_string<charT> string_type;
|
||||
typedef std::vector<string_type> collection_type;
|
||||
typedef std::basic_ostringstream<charT> ostream_type;
|
||||
typedef std::ostreambuf_iterator<charT> ostream_iter_type;
|
||||
typedef std::basic_ostringstream<charT> stringstream_type;
|
||||
typedef std::time_put<charT> time_put_facet_type;
|
||||
@@ -50,8 +51,9 @@ gather_month_strings(const std::locale& locale, bool short_strings=true)
|
||||
//grab the needed strings by using the locale to
|
||||
//output each month
|
||||
const charT* p_outfmt = outfmt.c_str(), *p_outfmt_end = p_outfmt + outfmt.size();
|
||||
tm tm_value;
|
||||
std::memset(&tm_value, 0, sizeof(tm_value));
|
||||
for (int m=0; m < 12; m++) {
|
||||
tm tm_value;
|
||||
tm_value.tm_mon = m;
|
||||
stringstream_type ss;
|
||||
ostream_iter_type oitr(ss);
|
||||
@@ -85,7 +87,6 @@ gather_weekday_strings(const std::locale& locale, bool short_strings=true)
|
||||
{
|
||||
typedef std::basic_string<charT> string_type;
|
||||
typedef std::vector<string_type> collection_type;
|
||||
typedef std::basic_ostringstream<charT> ostream_type;
|
||||
typedef std::ostreambuf_iterator<charT> ostream_iter_type;
|
||||
typedef std::basic_ostringstream<charT> stringstream_type;
|
||||
typedef std::time_put<charT> time_put_facet_type;
|
||||
@@ -103,8 +104,9 @@ gather_weekday_strings(const std::locale& locale, bool short_strings=true)
|
||||
//grab the needed strings by using the locale to
|
||||
//output each month / weekday
|
||||
const charT* p_outfmt = outfmt.c_str(), *p_outfmt_end = p_outfmt + outfmt.size();
|
||||
tm tm_value;
|
||||
std::memset(&tm_value, 0, sizeof(tm_value));
|
||||
for (int i=0; i < 7; i++) {
|
||||
tm tm_value;
|
||||
tm_value.tm_wday = i;
|
||||
stringstream_type ss;
|
||||
ostream_iter_type oitr(ss);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef DATE_TIME_TIME_HPP___
|
||||
#define DATE_TIME_TIME_HPP___
|
||||
|
||||
/* Copyright (c) 2002,2003,2005 CrystalClear Software, Inc.
|
||||
/* Copyright (c) 2002,2003,2005,2020 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
@@ -49,6 +49,8 @@ namespace date_time {
|
||||
> >
|
||||
{
|
||||
public:
|
||||
// A tag for type categorization. Can be used to detect Boost.DateTime time points in generic code.
|
||||
typedef void _is_boost_date_time_time_point;
|
||||
typedef T time_type;
|
||||
typedef typename time_system::time_rep_type time_rep_type;
|
||||
typedef typename time_system::date_type date_type;
|
||||
@@ -56,21 +58,26 @@ namespace date_time {
|
||||
typedef typename time_system::time_duration_type time_duration_type;
|
||||
//typedef typename time_system::hms_type hms_type;
|
||||
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
base_time(const date_type& day,
|
||||
const time_duration_type& td,
|
||||
dst_flags dst=not_dst) :
|
||||
time_(time_system::get_time_rep(day, td, dst))
|
||||
{}
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
base_time(special_values sv) :
|
||||
time_(time_system::get_time_rep(sv))
|
||||
{}
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
base_time(const time_rep_type& rhs) :
|
||||
time_(rhs)
|
||||
{}
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
date_type date() const
|
||||
{
|
||||
return time_system::get_date(time_);
|
||||
}
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
time_duration_type time_of_day() const
|
||||
{
|
||||
return time_system::get_time_of_day(time_);
|
||||
@@ -96,83 +103,99 @@ namespace date_time {
|
||||
}
|
||||
|
||||
//! check to see if date is not a value
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
bool is_not_a_date_time() const
|
||||
{
|
||||
return time_.is_not_a_date_time();
|
||||
}
|
||||
//! check to see if date is one of the infinity values
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
bool is_infinity() const
|
||||
{
|
||||
return (is_pos_infinity() || is_neg_infinity());
|
||||
}
|
||||
//! check to see if date is greater than all possible dates
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
bool is_pos_infinity() const
|
||||
{
|
||||
return time_.is_pos_infinity();
|
||||
}
|
||||
//! check to see if date is greater than all possible dates
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
bool is_neg_infinity() const
|
||||
{
|
||||
return time_.is_neg_infinity();
|
||||
}
|
||||
//! check to see if time is a special value
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
bool is_special() const
|
||||
{
|
||||
return(is_not_a_date_time() || is_infinity());
|
||||
}
|
||||
//!Equality operator -- others generated by boost::equality_comparable
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
bool operator==(const time_type& rhs) const
|
||||
{
|
||||
return time_system::is_equal(time_,rhs.time_);
|
||||
}
|
||||
//!Equality operator -- others generated by boost::less_than_comparable
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
bool operator<(const time_type& rhs) const
|
||||
{
|
||||
return time_system::is_less(time_,rhs.time_);
|
||||
}
|
||||
//! difference between two times
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
time_duration_type operator-(const time_type& rhs) const
|
||||
{
|
||||
return time_system::subtract_times(time_, rhs.time_);
|
||||
}
|
||||
//! add date durations
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
time_type operator+(const date_duration_type& dd) const
|
||||
{
|
||||
return time_system::add_days(time_, dd);
|
||||
}
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
time_type operator+=(const date_duration_type& dd)
|
||||
{
|
||||
time_ = (time_system::get_time_rep(date() + dd, time_of_day()));
|
||||
return time_type(time_);
|
||||
}
|
||||
//! subtract date durations
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
time_type operator-(const date_duration_type& dd) const
|
||||
{
|
||||
return time_system::subtract_days(time_, dd);
|
||||
}
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
time_type operator-=(const date_duration_type& dd)
|
||||
{
|
||||
time_ = (time_system::get_time_rep(date() - dd, time_of_day()));
|
||||
return time_type(time_);
|
||||
}
|
||||
//! add time durations
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
time_type operator+(const time_duration_type& td) const
|
||||
{
|
||||
return time_type(time_system::add_time_duration(time_, td));
|
||||
}
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
time_type operator+=(const time_duration_type& td)
|
||||
{
|
||||
time_ = (time_system::get_time_rep(date(), time_of_day() + td));
|
||||
time_ = time_system::add_time_duration(time_,td);
|
||||
return time_type(time_);
|
||||
}
|
||||
//! subtract time durations
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
time_type operator-(const time_duration_type& rhs) const
|
||||
{
|
||||
return time_system::subtract_time_duration(time_, rhs);
|
||||
}
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
time_type operator-=(const time_duration_type& td)
|
||||
{
|
||||
time_ = (time_system::get_time_rep(date(), time_of_day() - td));
|
||||
time_ = time_system::subtract_time_duration(time_, td);
|
||||
return time_type(time_);
|
||||
}
|
||||
|
||||
|
||||
@@ -2,18 +2,21 @@
|
||||
#define DATE_TIME_TIME_DURATION_HPP___
|
||||
|
||||
/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
* Author: Jeff Garland, Bart Garst
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include <boost/core/enable_if.hpp>
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/operators.hpp>
|
||||
#include <boost/date_time/time_defs.hpp>
|
||||
#include <boost/date_time/special_defs.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/special_defs.hpp>
|
||||
#include <boost/date_time/time_defs.hpp>
|
||||
#include <boost/operators.hpp>
|
||||
#include <boost/static_assert.hpp>
|
||||
#include <boost/type_traits/is_integral.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace date_time {
|
||||
@@ -26,11 +29,11 @@ namespace date_time {
|
||||
This design allows the subclass duration types to provide custom
|
||||
construction policies or other custom features not provided here.
|
||||
|
||||
@param T The subclass type
|
||||
@param rep_type The time resolution traits for this duration type.
|
||||
@tparam T The subclass type
|
||||
@tparam rep_type The time resolution traits for this duration type.
|
||||
*/
|
||||
template<class T, typename rep_type>
|
||||
class time_duration : private
|
||||
class BOOST_SYMBOL_VISIBLE time_duration : private
|
||||
boost::less_than_comparable<T
|
||||
, boost::equality_comparable<T
|
||||
> >
|
||||
@@ -41,6 +44,8 @@ namespace date_time {
|
||||
* either (haven't tried) */
|
||||
{
|
||||
public:
|
||||
// A tag for type categorization. Can be used to detect Boost.DateTime duration types in generic code.
|
||||
typedef void _is_boost_date_time_duration;
|
||||
typedef T duration_type; //the subclass
|
||||
typedef rep_type traits_type;
|
||||
typedef typename rep_type::day_type day_type;
|
||||
@@ -51,58 +56,53 @@ namespace date_time {
|
||||
typedef typename rep_type::tick_type tick_type;
|
||||
typedef typename rep_type::impl_type impl_type;
|
||||
|
||||
time_duration() : ticks_(0) {}
|
||||
time_duration(hour_type hours_in,
|
||||
BOOST_CXX14_CONSTEXPR time_duration() : ticks_(0) {}
|
||||
BOOST_CXX14_CONSTEXPR time_duration(hour_type hours_in,
|
||||
min_type minutes_in,
|
||||
sec_type seconds_in=0,
|
||||
fractional_seconds_type frac_sec_in = 0) :
|
||||
ticks_(rep_type::to_tick_count(hours_in,minutes_in,seconds_in,frac_sec_in))
|
||||
{}
|
||||
// copy constructor required for dividable<>
|
||||
//! Construct from another time_duration (Copy constructor)
|
||||
time_duration(const time_duration<T, rep_type>& other)
|
||||
: ticks_(other.ticks_)
|
||||
{}
|
||||
//! Construct from special_values
|
||||
time_duration(special_values sv) : ticks_(impl_type::from_special(sv))
|
||||
BOOST_CXX14_CONSTEXPR time_duration(special_values sv) : ticks_(impl_type::from_special(sv))
|
||||
{}
|
||||
//! Returns smallest representable duration
|
||||
static duration_type unit()
|
||||
static BOOST_CXX14_CONSTEXPR duration_type unit()
|
||||
{
|
||||
return duration_type(0,0,0,1);
|
||||
}
|
||||
//! Return the number of ticks in a second
|
||||
static tick_type ticks_per_second()
|
||||
static BOOST_CXX14_CONSTEXPR tick_type ticks_per_second()
|
||||
{
|
||||
return rep_type::res_adjust();
|
||||
}
|
||||
//! Provide the resolution of this duration type
|
||||
static time_resolutions resolution()
|
||||
static BOOST_CXX14_CONSTEXPR time_resolutions resolution()
|
||||
{
|
||||
return rep_type::resolution();
|
||||
}
|
||||
//! Returns number of hours in the duration
|
||||
hour_type hours() const
|
||||
BOOST_CXX14_CONSTEXPR hour_type hours() const
|
||||
{
|
||||
return static_cast<hour_type>(ticks() / (3600*ticks_per_second()));
|
||||
}
|
||||
//! Returns normalized number of minutes
|
||||
min_type minutes() const
|
||||
BOOST_CXX14_CONSTEXPR min_type minutes() const
|
||||
{
|
||||
return static_cast<min_type>((ticks() / (60*ticks_per_second())) % 60);
|
||||
}
|
||||
//! Returns normalized number of seconds (0..60)
|
||||
sec_type seconds() const
|
||||
BOOST_CXX14_CONSTEXPR sec_type seconds() const
|
||||
{
|
||||
return static_cast<sec_type>((ticks()/ticks_per_second()) % 60);
|
||||
}
|
||||
//! Returns total number of seconds truncating any fractional seconds
|
||||
sec_type total_seconds() const
|
||||
BOOST_CXX14_CONSTEXPR sec_type total_seconds() const
|
||||
{
|
||||
return static_cast<sec_type>(ticks() / ticks_per_second());
|
||||
}
|
||||
//! Returns total number of milliseconds truncating any fractional seconds
|
||||
tick_type total_milliseconds() const
|
||||
BOOST_CXX14_CONSTEXPR tick_type total_milliseconds() const
|
||||
{
|
||||
if (ticks_per_second() < 1000) {
|
||||
return ticks() * (static_cast<tick_type>(1000) / ticks_per_second());
|
||||
@@ -110,7 +110,7 @@ namespace date_time {
|
||||
return ticks() / (ticks_per_second() / static_cast<tick_type>(1000)) ;
|
||||
}
|
||||
//! Returns total number of nanoseconds truncating any sub millisecond values
|
||||
tick_type total_nanoseconds() const
|
||||
BOOST_CXX14_CONSTEXPR tick_type total_nanoseconds() const
|
||||
{
|
||||
if (ticks_per_second() < 1000000000) {
|
||||
return ticks() * (static_cast<tick_type>(1000000000) / ticks_per_second());
|
||||
@@ -118,7 +118,7 @@ namespace date_time {
|
||||
return ticks() / (ticks_per_second() / static_cast<tick_type>(1000000000)) ;
|
||||
}
|
||||
//! Returns total number of microseconds truncating any sub microsecond values
|
||||
tick_type total_microseconds() const
|
||||
BOOST_CXX14_CONSTEXPR tick_type total_microseconds() const
|
||||
{
|
||||
if (ticks_per_second() < 1000000) {
|
||||
return ticks() * (static_cast<tick_type>(1000000) / ticks_per_second());
|
||||
@@ -126,81 +126,97 @@ namespace date_time {
|
||||
return ticks() / (ticks_per_second() / static_cast<tick_type>(1000000)) ;
|
||||
}
|
||||
//! Returns count of fractional seconds at given resolution
|
||||
fractional_seconds_type fractional_seconds() const
|
||||
BOOST_CXX14_CONSTEXPR fractional_seconds_type fractional_seconds() const
|
||||
{
|
||||
return (ticks() % ticks_per_second());
|
||||
}
|
||||
//! Returns number of possible digits in fractional seconds
|
||||
static unsigned short num_fractional_digits()
|
||||
static BOOST_CXX14_CONSTEXPR unsigned short num_fractional_digits()
|
||||
{
|
||||
return rep_type::num_fractional_digits();
|
||||
}
|
||||
duration_type invert_sign() const
|
||||
BOOST_CXX14_CONSTEXPR duration_type invert_sign() const
|
||||
{
|
||||
return duration_type(ticks_ * (-1));
|
||||
}
|
||||
bool is_negative() const
|
||||
BOOST_CXX14_CONSTEXPR duration_type abs() const
|
||||
{
|
||||
if ( is_negative() )
|
||||
{
|
||||
return invert_sign();
|
||||
}
|
||||
return duration_type(ticks_);
|
||||
}
|
||||
BOOST_CONSTEXPR bool is_negative() const
|
||||
{
|
||||
return ticks_ < 0;
|
||||
}
|
||||
bool operator<(const time_duration& rhs) const
|
||||
BOOST_CONSTEXPR bool is_zero() const
|
||||
{
|
||||
return ticks_ == 0;
|
||||
}
|
||||
BOOST_CONSTEXPR bool is_positive() const
|
||||
{
|
||||
return ticks_ > 0;
|
||||
}
|
||||
BOOST_CONSTEXPR bool operator<(const time_duration& rhs) const
|
||||
{
|
||||
return ticks_ < rhs.ticks_;
|
||||
}
|
||||
bool operator==(const time_duration& rhs) const
|
||||
BOOST_CONSTEXPR bool operator==(const time_duration& rhs) const
|
||||
{
|
||||
return ticks_ == rhs.ticks_;
|
||||
}
|
||||
//! unary- Allows for time_duration td = -td1
|
||||
duration_type operator-()const
|
||||
BOOST_CONSTEXPR duration_type operator-()const
|
||||
{
|
||||
return duration_type(ticks_ * (-1));
|
||||
}
|
||||
duration_type operator-(const duration_type& d) const
|
||||
BOOST_CONSTEXPR duration_type operator-(const duration_type& d) const
|
||||
{
|
||||
return duration_type(ticks_ - d.ticks_);
|
||||
}
|
||||
duration_type operator+(const duration_type& d) const
|
||||
BOOST_CONSTEXPR duration_type operator+(const duration_type& d) const
|
||||
{
|
||||
return duration_type(ticks_ + d.ticks_);
|
||||
}
|
||||
duration_type operator/(int divisor) const
|
||||
BOOST_CONSTEXPR duration_type operator/(int divisor) const
|
||||
{
|
||||
return duration_type(ticks_ / divisor);
|
||||
}
|
||||
duration_type operator-=(const duration_type& d)
|
||||
BOOST_CXX14_CONSTEXPR duration_type operator-=(const duration_type& d)
|
||||
{
|
||||
ticks_ = ticks_ - d.ticks_;
|
||||
return duration_type(ticks_);
|
||||
}
|
||||
duration_type operator+=(const duration_type& d)
|
||||
BOOST_CXX14_CONSTEXPR duration_type operator+=(const duration_type& d)
|
||||
{
|
||||
ticks_ = ticks_ + d.ticks_;
|
||||
return duration_type(ticks_);
|
||||
}
|
||||
//! Division operations on a duration with an integer.
|
||||
duration_type operator/=(int divisor)
|
||||
BOOST_CXX14_CONSTEXPR duration_type operator/=(int divisor)
|
||||
{
|
||||
ticks_ = ticks_ / divisor;
|
||||
return duration_type(ticks_);
|
||||
}
|
||||
//! Multiplication operations an a duration with an integer
|
||||
duration_type operator*(int rhs) const
|
||||
BOOST_CXX14_CONSTEXPR duration_type operator*(int rhs) const
|
||||
{
|
||||
return duration_type(ticks_ * rhs);
|
||||
}
|
||||
duration_type operator*=(int divisor)
|
||||
BOOST_CXX14_CONSTEXPR duration_type operator*=(int divisor)
|
||||
{
|
||||
ticks_ = ticks_ * divisor;
|
||||
return duration_type(ticks_);
|
||||
}
|
||||
tick_type ticks() const
|
||||
BOOST_CXX14_CONSTEXPR tick_type ticks() const
|
||||
{
|
||||
return traits_type::as_number(ticks_);
|
||||
}
|
||||
|
||||
//! Is ticks_ a special value?
|
||||
bool is_special()const
|
||||
BOOST_CXX14_CONSTEXPR bool is_special()const
|
||||
{
|
||||
if(traits_type::is_adapted())
|
||||
{
|
||||
@@ -211,7 +227,7 @@ namespace date_time {
|
||||
}
|
||||
}
|
||||
//! Is duration pos-infinity
|
||||
bool is_pos_infinity()const
|
||||
BOOST_CXX14_CONSTEXPR bool is_pos_infinity()const
|
||||
{
|
||||
if(traits_type::is_adapted())
|
||||
{
|
||||
@@ -222,7 +238,7 @@ namespace date_time {
|
||||
}
|
||||
}
|
||||
//! Is duration neg-infinity
|
||||
bool is_neg_infinity()const
|
||||
BOOST_CXX14_CONSTEXPR bool is_neg_infinity()const
|
||||
{
|
||||
if(traits_type::is_adapted())
|
||||
{
|
||||
@@ -233,7 +249,7 @@ namespace date_time {
|
||||
}
|
||||
}
|
||||
//! Is duration not-a-date-time
|
||||
bool is_not_a_date_time()const
|
||||
BOOST_CXX14_CONSTEXPR bool is_not_a_date_time()const
|
||||
{
|
||||
if(traits_type::is_adapted())
|
||||
{
|
||||
@@ -245,13 +261,13 @@ namespace date_time {
|
||||
}
|
||||
|
||||
//! Used for special_values output
|
||||
impl_type get_rep()const
|
||||
BOOST_CONSTEXPR impl_type get_rep()const
|
||||
{
|
||||
return ticks_;
|
||||
}
|
||||
|
||||
protected:
|
||||
explicit time_duration(impl_type in) : ticks_(in) {};
|
||||
BOOST_CXX14_CONSTEXPR explicit time_duration(impl_type in) : ticks_(in) {}
|
||||
impl_type ticks_;
|
||||
};
|
||||
|
||||
@@ -259,20 +275,32 @@ namespace date_time {
|
||||
|
||||
//! Template for instantiating derived adjusting durations
|
||||
/* These templates are designed to work with multiples of
|
||||
* 10 for frac_of_second and resoultion adjustment
|
||||
* 10 for frac_of_second and resolution adjustment
|
||||
*/
|
||||
template<class base_duration, boost::int64_t frac_of_second>
|
||||
class subsecond_duration : public base_duration
|
||||
class BOOST_SYMBOL_VISIBLE subsecond_duration : public base_duration
|
||||
{
|
||||
public:
|
||||
typedef typename base_duration::impl_type impl_type;
|
||||
typedef typename base_duration::traits_type traits_type;
|
||||
explicit subsecond_duration(boost::int64_t ss) :
|
||||
base_duration(0,0,0,ss*traits_type::res_adjust()/frac_of_second)
|
||||
{}
|
||||
|
||||
private:
|
||||
// To avoid integer overflow we precompute the duration resolution conversion coefficient (ticket #3471)
|
||||
BOOST_STATIC_ASSERT_MSG((traits_type::ticks_per_second >= frac_of_second ? traits_type::ticks_per_second % frac_of_second : frac_of_second % traits_type::ticks_per_second) == 0,\
|
||||
"The base duration resolution must be a multiple of the subsecond duration resolution");
|
||||
BOOST_STATIC_CONSTANT(boost::int64_t, adjustment_ratio = (traits_type::ticks_per_second >= frac_of_second ? traits_type::ticks_per_second / frac_of_second : frac_of_second / traits_type::ticks_per_second));
|
||||
|
||||
public:
|
||||
// The argument (ss) must be an integral type
|
||||
template <typename T>
|
||||
BOOST_CXX14_CONSTEXPR explicit subsecond_duration(T const& ss,
|
||||
typename boost::enable_if<boost::is_integral<T>,
|
||||
void>::type* = BOOST_DATE_TIME_NULLPTR) :
|
||||
base_duration(impl_type(traits_type::ticks_per_second >= frac_of_second ? ss * adjustment_ratio : ss / adjustment_ratio))
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
} } //namespace date_time
|
||||
|
||||
|
||||
|
||||
@@ -11,16 +11,17 @@
|
||||
*/
|
||||
|
||||
#include <cctype>
|
||||
#include <locale>
|
||||
#include <limits>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <exception>
|
||||
#include <iomanip>
|
||||
#include <iterator> // i/ostreambuf_iterator
|
||||
#include <exception>
|
||||
#include <locale>
|
||||
#include <limits>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <boost/assert.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <boost/throw_exception.hpp>
|
||||
#include <boost/range/as_literal.hpp>
|
||||
#include <boost/algorithm/string/erase.hpp>
|
||||
#include <boost/algorithm/string/replace.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
@@ -42,6 +43,10 @@ namespace date_time {
|
||||
static const char_type seconds_format[3]; // S
|
||||
static const char_type hours_format[3]; // H
|
||||
static const char_type unrestricted_hours_format[3]; // O
|
||||
static const char_type full_24_hour_time_format[3]; // T
|
||||
static const char_type full_24_hour_time_expanded_format[9]; // HH:MM:SS
|
||||
static const char_type short_24_hour_time_format[3]; // R
|
||||
static const char_type short_24_hour_time_expanded_format[6]; // HH:MM
|
||||
static const char_type standard_format[9]; // x X
|
||||
static const char_type zone_abbrev_format[3]; // z
|
||||
static const char_type zone_name_format[3]; // Z
|
||||
@@ -73,8 +78,7 @@ namespace date_time {
|
||||
|
||||
template <class CharT>
|
||||
const typename time_formats<CharT>::char_type
|
||||
time_formats<CharT>::seconds_with_fractional_seconds_format[3] =
|
||||
{'%','s'};
|
||||
time_formats<CharT>::seconds_with_fractional_seconds_format[3] = {'%','s'};
|
||||
|
||||
template <class CharT>
|
||||
const typename time_formats<CharT>::char_type
|
||||
@@ -88,6 +92,24 @@ namespace date_time {
|
||||
const typename time_formats<CharT>::char_type
|
||||
time_formats<CharT>::unrestricted_hours_format[3] = {'%','O'};
|
||||
|
||||
template <class CharT>
|
||||
const typename time_formats<CharT>::char_type
|
||||
time_formats<CharT>::full_24_hour_time_format[3] = {'%','T'};
|
||||
|
||||
template <class CharT>
|
||||
const typename time_formats<CharT>::char_type
|
||||
time_formats<CharT>::full_24_hour_time_expanded_format[9] =
|
||||
{'%','H',':','%','M',':','%','S'};
|
||||
|
||||
template <class CharT>
|
||||
const typename time_formats<CharT>::char_type
|
||||
time_formats<CharT>::short_24_hour_time_format[3] = {'%','R'};
|
||||
|
||||
template <class CharT>
|
||||
const typename time_formats<CharT>::char_type
|
||||
time_formats<CharT>::short_24_hour_time_expanded_format[6] =
|
||||
{'%','H',':','%','M'};
|
||||
|
||||
template <class CharT>
|
||||
const typename time_formats<CharT>::char_type
|
||||
//time_formats<CharT>::standard_format[5] = {'%','c',' ','%','z'};
|
||||
@@ -178,8 +200,9 @@ namespace date_time {
|
||||
template <class time_type,
|
||||
class CharT,
|
||||
class OutItrT = std::ostreambuf_iterator<CharT, std::char_traits<CharT> > >
|
||||
class time_facet :
|
||||
class BOOST_SYMBOL_VISIBLE time_facet :
|
||||
public boost::date_time::date_facet<typename time_type::date_type , CharT, OutItrT> {
|
||||
typedef time_formats< CharT > formats_type;
|
||||
public:
|
||||
typedef typename time_type::date_type date_type;
|
||||
typedef typename time_type::time_duration_type time_duration_type;
|
||||
@@ -221,22 +244,22 @@ namespace date_time {
|
||||
#endif
|
||||
|
||||
//! sets default formats for ptime, local_date_time, and time_duration
|
||||
explicit time_facet(::size_t a_ref = 0)
|
||||
: base_type(default_time_format, period_formatter_type(), special_values_formatter_type(), date_gen_formatter_type(), a_ref),
|
||||
explicit time_facet(::size_t ref_arg = 0)
|
||||
: base_type(default_time_format, period_formatter_type(), special_values_formatter_type(), date_gen_formatter_type(), ref_arg),
|
||||
m_time_duration_format(string_type(duration_sign_negative_only) + default_time_duration_format)
|
||||
{}
|
||||
|
||||
//! Construct the facet with an explicitly specified format
|
||||
explicit time_facet(const char_type* a_format,
|
||||
period_formatter_type period_formatter = period_formatter_type(),
|
||||
explicit time_facet(const char_type* format_arg,
|
||||
period_formatter_type period_formatter_arg = period_formatter_type(),
|
||||
const special_values_formatter_type& special_value_formatter = special_values_formatter_type(),
|
||||
date_gen_formatter_type dg_formatter = date_gen_formatter_type(),
|
||||
::size_t a_ref = 0)
|
||||
: base_type(a_format,
|
||||
period_formatter,
|
||||
::size_t ref_arg = 0)
|
||||
: base_type(format_arg,
|
||||
period_formatter_arg,
|
||||
special_value_formatter,
|
||||
dg_formatter,
|
||||
a_ref),
|
||||
ref_arg),
|
||||
m_time_duration_format(string_type(duration_sign_negative_only) + default_time_duration_format)
|
||||
{}
|
||||
|
||||
@@ -246,57 +269,65 @@ namespace date_time {
|
||||
m_time_duration_format = format;
|
||||
}
|
||||
|
||||
virtual void set_iso_format()
|
||||
void set_iso_format() BOOST_OVERRIDE
|
||||
{
|
||||
this->m_format = iso_time_format_specifier;
|
||||
}
|
||||
virtual void set_iso_extended_format()
|
||||
void set_iso_extended_format() BOOST_OVERRIDE
|
||||
{
|
||||
this->m_format = iso_time_format_extended_specifier;
|
||||
}
|
||||
|
||||
OutItrT put(OutItrT a_next,
|
||||
std::ios_base& a_ios,
|
||||
char_type a_fill,
|
||||
const time_type& a_time) const
|
||||
OutItrT put(OutItrT next_arg,
|
||||
std::ios_base& ios_arg,
|
||||
char_type fill_arg,
|
||||
const time_type& time_arg) const
|
||||
{
|
||||
if (a_time.is_special()) {
|
||||
return this->do_put_special(a_next, a_ios, a_fill,
|
||||
a_time.date().as_special());
|
||||
if (time_arg.is_special()) {
|
||||
return this->do_put_special(next_arg, ios_arg, fill_arg,
|
||||
time_arg.date().as_special());
|
||||
}
|
||||
string_type format(this->m_format);
|
||||
string_type local_format(this->m_format);
|
||||
|
||||
// %T and %R have to be replaced here since they are not standard
|
||||
boost::algorithm::replace_all(local_format,
|
||||
boost::as_literal(formats_type::full_24_hour_time_format),
|
||||
boost::as_literal(formats_type::full_24_hour_time_expanded_format));
|
||||
boost::algorithm::replace_all(local_format,
|
||||
boost::as_literal(formats_type::short_24_hour_time_format),
|
||||
boost::as_literal(formats_type::short_24_hour_time_expanded_format));
|
||||
|
||||
string_type frac_str;
|
||||
if (format.find(seconds_with_fractional_seconds_format) != string_type::npos) {
|
||||
if (local_format.find(seconds_with_fractional_seconds_format) != string_type::npos) {
|
||||
// replace %s with %S.nnn
|
||||
frac_str =
|
||||
fractional_seconds_as_string(a_time.time_of_day(), false);
|
||||
char_type sep = std::use_facet<std::numpunct<char_type> >(a_ios.getloc()).decimal_point();
|
||||
fractional_seconds_as_string(time_arg.time_of_day(), false);
|
||||
char_type sep = std::use_facet<std::numpunct<char_type> >(ios_arg.getloc()).decimal_point();
|
||||
|
||||
string_type replace_string(seconds_format);
|
||||
replace_string += sep;
|
||||
replace_string += frac_str;
|
||||
boost::algorithm::replace_all(format,
|
||||
boost::algorithm::replace_all(local_format,
|
||||
seconds_with_fractional_seconds_format,
|
||||
replace_string);
|
||||
}
|
||||
/* NOTE: replacing posix_zone_string_format must be done BEFORE
|
||||
* zone_name_format: "%ZP" & "%Z", if Z is checked first it will
|
||||
* incorrectly replace a zone_name where a posix_string should go */
|
||||
if (format.find(posix_zone_string_format) != string_type::npos) {
|
||||
if(a_time.zone_abbrev().empty()) {
|
||||
if (local_format.find(posix_zone_string_format) != string_type::npos) {
|
||||
if(time_arg.zone_abbrev().empty()) {
|
||||
// if zone_abbrev() returns an empty string, we want to
|
||||
// erase posix_zone_string_format from format
|
||||
boost::algorithm::erase_all(format, posix_zone_string_format);
|
||||
boost::algorithm::erase_all(local_format, posix_zone_string_format);
|
||||
}
|
||||
else{
|
||||
boost::algorithm::replace_all(format,
|
||||
boost::algorithm::replace_all(local_format,
|
||||
posix_zone_string_format,
|
||||
a_time.zone_as_posix_string());
|
||||
time_arg.zone_as_posix_string());
|
||||
}
|
||||
}
|
||||
if (format.find(zone_name_format) != string_type::npos) {
|
||||
if(a_time.zone_name().empty()) {
|
||||
if (local_format.find(zone_name_format) != string_type::npos) {
|
||||
if(time_arg.zone_name().empty()) {
|
||||
/* TODO: this'll probably create problems if a user places
|
||||
* the zone_*_format flag in the format with a ptime. This
|
||||
* code removes the flag from the default formats */
|
||||
@@ -305,16 +336,16 @@ namespace date_time {
|
||||
// erase zone_name_format & one preceeding space
|
||||
std::basic_ostringstream<char_type> ss;
|
||||
ss << ' ' << zone_name_format;
|
||||
boost::algorithm::erase_all(format, ss.str());
|
||||
boost::algorithm::erase_all(local_format, ss.str());
|
||||
}
|
||||
else{
|
||||
boost::algorithm::replace_all(format,
|
||||
boost::algorithm::replace_all(local_format,
|
||||
zone_name_format,
|
||||
a_time.zone_name());
|
||||
time_arg.zone_name());
|
||||
}
|
||||
}
|
||||
if (format.find(zone_abbrev_format) != string_type::npos) {
|
||||
if(a_time.zone_abbrev(false).empty()) {
|
||||
if (local_format.find(zone_abbrev_format) != string_type::npos) {
|
||||
if(time_arg.zone_abbrev(false).empty()) {
|
||||
/* TODO: this'll probably create problems if a user places
|
||||
* the zone_*_format flag in the format with a ptime. This
|
||||
* code removes the flag from the default formats */
|
||||
@@ -323,93 +354,93 @@ namespace date_time {
|
||||
// erase zone_abbrev_format & one preceeding space
|
||||
std::basic_ostringstream<char_type> ss;
|
||||
ss << ' ' << zone_abbrev_format;
|
||||
boost::algorithm::erase_all(format, ss.str());
|
||||
boost::algorithm::erase_all(local_format, ss.str());
|
||||
}
|
||||
else{
|
||||
boost::algorithm::replace_all(format,
|
||||
boost::algorithm::replace_all(local_format,
|
||||
zone_abbrev_format,
|
||||
a_time.zone_abbrev(false));
|
||||
time_arg.zone_abbrev(false));
|
||||
}
|
||||
}
|
||||
if (format.find(zone_iso_extended_format) != string_type::npos) {
|
||||
if(a_time.zone_name(true).empty()) {
|
||||
if (local_format.find(zone_iso_extended_format) != string_type::npos) {
|
||||
if(time_arg.zone_name(true).empty()) {
|
||||
/* TODO: this'll probably create problems if a user places
|
||||
* the zone_*_format flag in the format with a ptime. This
|
||||
* code removes the flag from the default formats */
|
||||
|
||||
// if zone_name() returns an empty string, we want to
|
||||
// erase zone_iso_extended_format from format
|
||||
boost::algorithm::erase_all(format, zone_iso_extended_format);
|
||||
boost::algorithm::erase_all(local_format, zone_iso_extended_format);
|
||||
}
|
||||
else{
|
||||
boost::algorithm::replace_all(format,
|
||||
boost::algorithm::replace_all(local_format,
|
||||
zone_iso_extended_format,
|
||||
a_time.zone_name(true));
|
||||
time_arg.zone_name(true));
|
||||
}
|
||||
}
|
||||
|
||||
if (format.find(zone_iso_format) != string_type::npos) {
|
||||
if(a_time.zone_abbrev(true).empty()) {
|
||||
if (local_format.find(zone_iso_format) != string_type::npos) {
|
||||
if(time_arg.zone_abbrev(true).empty()) {
|
||||
/* TODO: this'll probably create problems if a user places
|
||||
* the zone_*_format flag in the format with a ptime. This
|
||||
* code removes the flag from the default formats */
|
||||
|
||||
// if zone_abbrev() returns an empty string, we want to
|
||||
// erase zone_iso_format from format
|
||||
boost::algorithm::erase_all(format, zone_iso_format);
|
||||
boost::algorithm::erase_all(local_format, zone_iso_format);
|
||||
}
|
||||
else{
|
||||
boost::algorithm::replace_all(format,
|
||||
boost::algorithm::replace_all(local_format,
|
||||
zone_iso_format,
|
||||
a_time.zone_abbrev(true));
|
||||
time_arg.zone_abbrev(true));
|
||||
}
|
||||
}
|
||||
if (format.find(fractional_seconds_format) != string_type::npos) {
|
||||
if (local_format.find(fractional_seconds_format) != string_type::npos) {
|
||||
// replace %f with nnnnnnn
|
||||
if (!frac_str.size()) {
|
||||
frac_str = fractional_seconds_as_string(a_time.time_of_day(), false);
|
||||
if (frac_str.empty()) {
|
||||
frac_str = fractional_seconds_as_string(time_arg.time_of_day(), false);
|
||||
}
|
||||
boost::algorithm::replace_all(format,
|
||||
boost::algorithm::replace_all(local_format,
|
||||
fractional_seconds_format,
|
||||
frac_str);
|
||||
}
|
||||
|
||||
if (format.find(fractional_seconds_or_none_format) != string_type::npos) {
|
||||
if (local_format.find(fractional_seconds_or_none_format) != string_type::npos) {
|
||||
// replace %F with nnnnnnn or nothing if fs == 0
|
||||
frac_str =
|
||||
fractional_seconds_as_string(a_time.time_of_day(), true);
|
||||
if (frac_str.size()) {
|
||||
char_type sep = std::use_facet<std::numpunct<char_type> >(a_ios.getloc()).decimal_point();
|
||||
fractional_seconds_as_string(time_arg.time_of_day(), true);
|
||||
if (!frac_str.empty()) {
|
||||
char_type sep = std::use_facet<std::numpunct<char_type> >(ios_arg.getloc()).decimal_point();
|
||||
string_type replace_string;
|
||||
replace_string += sep;
|
||||
replace_string += frac_str;
|
||||
boost::algorithm::replace_all(format,
|
||||
boost::algorithm::replace_all(local_format,
|
||||
fractional_seconds_or_none_format,
|
||||
replace_string);
|
||||
}
|
||||
else {
|
||||
boost::algorithm::erase_all(format,
|
||||
boost::algorithm::erase_all(local_format,
|
||||
fractional_seconds_or_none_format);
|
||||
}
|
||||
}
|
||||
|
||||
return this->do_put_tm(a_next, a_ios, a_fill,
|
||||
to_tm(a_time), format);
|
||||
return this->do_put_tm(next_arg, ios_arg, fill_arg,
|
||||
to_tm(time_arg), local_format);
|
||||
}
|
||||
|
||||
//! put function for time_duration
|
||||
OutItrT put(OutItrT a_next,
|
||||
std::ios_base& a_ios,
|
||||
char_type a_fill,
|
||||
const time_duration_type& a_time_dur) const
|
||||
OutItrT put(OutItrT next_arg,
|
||||
std::ios_base& ios_arg,
|
||||
char_type fill_arg,
|
||||
const time_duration_type& time_dur_arg) const
|
||||
{
|
||||
if (a_time_dur.is_special()) {
|
||||
return this->do_put_special(a_next, a_ios, a_fill,
|
||||
a_time_dur.get_rep().as_special());
|
||||
if (time_dur_arg.is_special()) {
|
||||
return this->do_put_special(next_arg, ios_arg, fill_arg,
|
||||
time_dur_arg.get_rep().as_special());
|
||||
}
|
||||
|
||||
string_type format(m_time_duration_format);
|
||||
if (a_time_dur.is_negative()) {
|
||||
if (time_dur_arg.is_negative()) {
|
||||
// replace %- with minus sign. Should we use the numpunct facet?
|
||||
boost::algorithm::replace_all(format,
|
||||
duration_sign_negative_only,
|
||||
@@ -428,6 +459,14 @@ namespace date_time {
|
||||
positive_sign);
|
||||
}
|
||||
|
||||
// %T and %R have to be replaced here since they are not standard
|
||||
boost::algorithm::replace_all(format,
|
||||
boost::as_literal(formats_type::full_24_hour_time_format),
|
||||
boost::as_literal(formats_type::full_24_hour_time_expanded_format));
|
||||
boost::algorithm::replace_all(format,
|
||||
boost::as_literal(formats_type::short_24_hour_time_format),
|
||||
boost::as_literal(formats_type::short_24_hour_time_expanded_format));
|
||||
|
||||
/*
|
||||
* It is possible for a time duration to span more then 24 hours.
|
||||
* Standard time_put::put is obliged to behave the same as strftime
|
||||
@@ -438,15 +477,15 @@ namespace date_time {
|
||||
*/
|
||||
string_type hours_str;
|
||||
if (format.find(unrestricted_hours_format) != string_type::npos) {
|
||||
hours_str = hours_as_string(a_time_dur);
|
||||
hours_str = hours_as_string(time_dur_arg);
|
||||
boost::algorithm::replace_all(format, unrestricted_hours_format, hours_str);
|
||||
}
|
||||
// We still have to process restricted hours format specifier. In order to
|
||||
// support parseability of durations in ISO format (%H%M%S), we'll have to
|
||||
// support parseability of durations in ISO 8601 format (%H%M%S), we'll have to
|
||||
// restrict the stringified hours length to 2 characters.
|
||||
if (format.find(hours_format) != string_type::npos) {
|
||||
if (hours_str.empty())
|
||||
hours_str = hours_as_string(a_time_dur);
|
||||
hours_str = hours_as_string(time_dur_arg);
|
||||
BOOST_ASSERT(hours_str.length() <= 2);
|
||||
boost::algorithm::replace_all(format, hours_format, hours_str);
|
||||
}
|
||||
@@ -455,8 +494,8 @@ namespace date_time {
|
||||
if (format.find(seconds_with_fractional_seconds_format) != string_type::npos) {
|
||||
// replace %s with %S.nnn
|
||||
frac_str =
|
||||
fractional_seconds_as_string(a_time_dur, false);
|
||||
char_type sep = std::use_facet<std::numpunct<char_type> >(a_ios.getloc()).decimal_point();
|
||||
fractional_seconds_as_string(time_dur_arg, false);
|
||||
char_type sep = std::use_facet<std::numpunct<char_type> >(ios_arg.getloc()).decimal_point();
|
||||
|
||||
string_type replace_string(seconds_format);
|
||||
replace_string += sep;
|
||||
@@ -468,7 +507,7 @@ namespace date_time {
|
||||
if (format.find(fractional_seconds_format) != string_type::npos) {
|
||||
// replace %f with nnnnnnn
|
||||
if (!frac_str.size()) {
|
||||
frac_str = fractional_seconds_as_string(a_time_dur, false);
|
||||
frac_str = fractional_seconds_as_string(time_dur_arg, false);
|
||||
}
|
||||
boost::algorithm::replace_all(format,
|
||||
fractional_seconds_format,
|
||||
@@ -478,9 +517,9 @@ namespace date_time {
|
||||
if (format.find(fractional_seconds_or_none_format) != string_type::npos) {
|
||||
// replace %F with nnnnnnn or nothing if fs == 0
|
||||
frac_str =
|
||||
fractional_seconds_as_string(a_time_dur, true);
|
||||
fractional_seconds_as_string(time_dur_arg, true);
|
||||
if (frac_str.size()) {
|
||||
char_type sep = std::use_facet<std::numpunct<char_type> >(a_ios.getloc()).decimal_point();
|
||||
char_type sep = std::use_facet<std::numpunct<char_type> >(ios_arg.getloc()).decimal_point();
|
||||
string_type replace_string;
|
||||
replace_string += sep;
|
||||
replace_string += frac_str;
|
||||
@@ -494,14 +533,14 @@ namespace date_time {
|
||||
}
|
||||
}
|
||||
|
||||
return this->do_put_tm(a_next, a_ios, a_fill,
|
||||
to_tm(a_time_dur), format);
|
||||
return this->do_put_tm(next_arg, ios_arg, fill_arg,
|
||||
to_tm(time_dur_arg), format);
|
||||
}
|
||||
|
||||
OutItrT put(OutItrT next, std::ios_base& a_ios,
|
||||
OutItrT put(OutItrT next, std::ios_base& ios_arg,
|
||||
char_type fill, const period_type& p) const
|
||||
{
|
||||
return this->m_period_formatter.put_period(next, a_ios, fill,p,*this);
|
||||
return this->m_period_formatter.put_period(next, ios_arg, fill,p,*this);
|
||||
}
|
||||
|
||||
|
||||
@@ -509,11 +548,11 @@ namespace date_time {
|
||||
|
||||
static
|
||||
string_type
|
||||
fractional_seconds_as_string(const time_duration_type& a_time,
|
||||
fractional_seconds_as_string(const time_duration_type& time_arg,
|
||||
bool null_when_zero)
|
||||
{
|
||||
typename time_duration_type::fractional_seconds_type frac_sec =
|
||||
a_time.fractional_seconds();
|
||||
time_arg.fractional_seconds();
|
||||
|
||||
if (null_when_zero && (frac_sec == 0)) {
|
||||
return string_type();
|
||||
@@ -527,9 +566,9 @@ namespace date_time {
|
||||
|
||||
static
|
||||
string_type
|
||||
hours_as_string(const time_duration_type& a_time, int width = 2)
|
||||
hours_as_string(const time_duration_type& time_arg, int width = 2)
|
||||
{
|
||||
return integral_as_string(date_time::absolute_value(a_time.hours()), width);
|
||||
return integral_as_string(date_time::absolute_value(time_arg.hours()), width);
|
||||
}
|
||||
|
||||
template< typename IntT >
|
||||
@@ -654,7 +693,7 @@ namespace date_time {
|
||||
template <class time_type,
|
||||
class CharT,
|
||||
class InItrT = std::istreambuf_iterator<CharT, std::char_traits<CharT> > >
|
||||
class time_input_facet :
|
||||
class BOOST_SYMBOL_VISIBLE time_input_facet :
|
||||
public boost::date_time::date_input_facet<typename time_type::date_type , CharT, InItrT> {
|
||||
public:
|
||||
typedef typename time_type::date_type date_type;
|
||||
@@ -692,8 +731,8 @@ namespace date_time {
|
||||
static std::locale::id id;
|
||||
|
||||
//! Constructor that takes a format string for a ptime
|
||||
explicit time_input_facet(const string_type& format, ::size_t a_ref = 0)
|
||||
: base_type(format, a_ref),
|
||||
explicit time_input_facet(const string_type& format, ::size_t ref_arg = 0)
|
||||
: base_type(format, ref_arg),
|
||||
m_time_duration_format(default_time_duration_format)
|
||||
{ }
|
||||
|
||||
@@ -702,19 +741,19 @@ namespace date_time {
|
||||
const special_values_parser_type& sv_parser,
|
||||
const period_parser_type& per_parser,
|
||||
const date_gen_parser_type& date_gen_parser,
|
||||
::size_t a_ref = 0)
|
||||
::size_t ref_arg = 0)
|
||||
: base_type(format,
|
||||
date_parser,
|
||||
sv_parser,
|
||||
per_parser,
|
||||
date_gen_parser,
|
||||
a_ref),
|
||||
ref_arg),
|
||||
m_time_duration_format(default_time_duration_format)
|
||||
{}
|
||||
|
||||
//! sets default formats for ptime, local_date_time, and time_duration
|
||||
explicit time_input_facet(::size_t a_ref = 0)
|
||||
: base_type(default_time_input_format, a_ref),
|
||||
explicit time_input_facet(::size_t ref_arg = 0)
|
||||
: base_type(default_time_input_format, ref_arg),
|
||||
m_time_duration_format(default_time_duration_format)
|
||||
{ }
|
||||
|
||||
@@ -733,12 +772,12 @@ namespace date_time {
|
||||
|
||||
InItrT get(InItrT& sitr,
|
||||
InItrT& stream_end,
|
||||
std::ios_base& a_ios,
|
||||
std::ios_base& ios_arg,
|
||||
period_type& p) const
|
||||
{
|
||||
p = this->m_period_parser.get_period(sitr,
|
||||
stream_end,
|
||||
a_ios,
|
||||
ios_arg,
|
||||
p,
|
||||
time_duration_type::unit(),
|
||||
*this);
|
||||
@@ -750,7 +789,7 @@ namespace date_time {
|
||||
|
||||
InItrT get(InItrT& sitr,
|
||||
InItrT& stream_end,
|
||||
std::ios_base& a_ios,
|
||||
std::ios_base& ios_arg,
|
||||
time_duration_type& td) const
|
||||
{
|
||||
// skip leading whitespace
|
||||
@@ -774,16 +813,16 @@ namespace date_time {
|
||||
typename time_duration_type::fractional_seconds_type frac(0);
|
||||
|
||||
typedef std::num_get<CharT, InItrT> num_get;
|
||||
if(!std::has_facet<num_get>(a_ios.getloc())) {
|
||||
if(!std::has_facet<num_get>(ios_arg.getloc())) {
|
||||
num_get* ng = new num_get();
|
||||
std::locale loc = std::locale(a_ios.getloc(), ng);
|
||||
a_ios.imbue(loc);
|
||||
std::locale loc = std::locale(ios_arg.getloc(), ng);
|
||||
ios_arg.imbue(loc);
|
||||
}
|
||||
|
||||
const_itr itr(m_time_duration_format.begin());
|
||||
while (itr != m_time_duration_format.end() && (sitr != stream_end)) {
|
||||
if (*itr == '%') {
|
||||
++itr;
|
||||
if (++itr == m_time_duration_format.end()) break;
|
||||
if (*itr != '%') {
|
||||
switch(*itr) {
|
||||
case 'O':
|
||||
@@ -827,6 +866,7 @@ namespace date_time {
|
||||
break;
|
||||
// %s is the same as %S%f so we drop through into %f
|
||||
}
|
||||
/* Falls through. */
|
||||
case 'f':
|
||||
{
|
||||
// check for decimal, check special_values if missing
|
||||
@@ -889,27 +929,27 @@ namespace date_time {
|
||||
//! Parses a time object from the input stream
|
||||
InItrT get(InItrT& sitr,
|
||||
InItrT& stream_end,
|
||||
std::ios_base& a_ios,
|
||||
std::ios_base& ios_arg,
|
||||
time_type& t) const
|
||||
{
|
||||
string_type tz_str;
|
||||
return get(sitr, stream_end, a_ios, t, tz_str, false);
|
||||
return get(sitr, stream_end, ios_arg, t, tz_str, false);
|
||||
}
|
||||
//! Expects a time_zone in the input stream
|
||||
InItrT get_local_time(InItrT& sitr,
|
||||
InItrT& stream_end,
|
||||
std::ios_base& a_ios,
|
||||
std::ios_base& ios_arg,
|
||||
time_type& t,
|
||||
string_type& tz_str) const
|
||||
{
|
||||
return get(sitr, stream_end, a_ios, t, tz_str, true);
|
||||
return get(sitr, stream_end, ios_arg, t, tz_str, true);
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
InItrT get(InItrT& sitr,
|
||||
InItrT& stream_end,
|
||||
std::ios_base& a_ios,
|
||||
std::ios_base& ios_arg,
|
||||
time_type& t,
|
||||
string_type& tz_str,
|
||||
bool time_is_local) const
|
||||
@@ -918,7 +958,7 @@ namespace date_time {
|
||||
while((sitr != stream_end) && std::isspace(*sitr)) { ++sitr; }
|
||||
|
||||
bool use_current_char = false;
|
||||
bool use_current_format_char = false; // used whith two character flags
|
||||
bool use_current_format_char = false; // used with two character flags
|
||||
|
||||
// num_get will consume the +/-, we may need a copy if special_value
|
||||
char_type c = '\0';
|
||||
@@ -946,16 +986,16 @@ namespace date_time {
|
||||
day_type t_day(1);
|
||||
|
||||
typedef std::num_get<CharT, InItrT> num_get;
|
||||
if(!std::has_facet<num_get>(a_ios.getloc())) {
|
||||
if(!std::has_facet<num_get>(ios_arg.getloc())) {
|
||||
num_get* ng = new num_get();
|
||||
std::locale loc = std::locale(a_ios.getloc(), ng);
|
||||
a_ios.imbue(loc);
|
||||
std::locale loc = std::locale(ios_arg.getloc(), ng);
|
||||
ios_arg.imbue(loc);
|
||||
}
|
||||
|
||||
const_itr itr(this->m_format.begin());
|
||||
while (itr != this->m_format.end() && (sitr != stream_end)) {
|
||||
if (*itr == '%') {
|
||||
++itr;
|
||||
if (++itr == this->m_format.end()) break;
|
||||
if (*itr != '%') {
|
||||
// the cases are grouped by date & time flags - not alphabetical order
|
||||
switch(*itr) {
|
||||
@@ -1049,9 +1089,12 @@ namespace date_time {
|
||||
break;
|
||||
}
|
||||
case 'd':
|
||||
case 'e':
|
||||
{
|
||||
try {
|
||||
t_day = this->m_parser.parse_day_of_month(sitr, stream_end);
|
||||
t_day = (*itr == 'd') ?
|
||||
this->m_parser.parse_day_of_month(sitr, stream_end) :
|
||||
this->m_parser.parse_var_day_of_month(sitr, stream_end);
|
||||
}
|
||||
catch(std::out_of_range&) { // base class for exception bad_day_of_month
|
||||
match_results mr;
|
||||
@@ -1092,10 +1135,12 @@ namespace date_time {
|
||||
if(sec == -1){
|
||||
return check_special_value(sitr, stream_end, t, c);
|
||||
}
|
||||
if (*itr == 'S')
|
||||
if (*itr == 'S' || sitr == stream_end)
|
||||
break;
|
||||
// %s is the same as %S%f so we drop through into %f
|
||||
// %s is the same as %S%f so we drop through into %f if we are
|
||||
// not at the end of the stream
|
||||
}
|
||||
/* Falls through. */
|
||||
case 'f':
|
||||
{
|
||||
// check for decimal, check SV if missing
|
||||
@@ -1187,7 +1232,7 @@ namespace date_time {
|
||||
|
||||
date_type d(not_a_date_time);
|
||||
if (day_of_year > 0) {
|
||||
d = date_type(static_cast<unsigned short>(t_year-1),12,31) + date_duration_type(day_of_year);
|
||||
d = date_type(static_cast<unsigned short>(t_year),1,1) + date_duration_type(day_of_year-1);
|
||||
}
|
||||
else {
|
||||
d = date_type(t_year, t_month, t_day);
|
||||
@@ -1210,7 +1255,7 @@ namespace date_time {
|
||||
if((c == '-' || c == '+') && (*sitr != c)) { // was the first character consumed?
|
||||
mr.cache += c;
|
||||
}
|
||||
this->m_sv_parser.match(sitr, stream_end, mr);
|
||||
(void)this->m_sv_parser.match(sitr, stream_end, mr);
|
||||
if(mr.current_match == match_results::PARSE_ERROR) {
|
||||
std::string tmp = convert_string_type<char_type, char>(mr.cache);
|
||||
boost::throw_exception(std::ios_base::failure("Parse failed. No match found for '" + tmp + "'"));
|
||||
@@ -1320,9 +1365,6 @@ template <class time_type, class CharT, class InItrT>
|
||||
const typename time_input_facet<time_type, CharT, InItrT>::char_type*
|
||||
time_input_facet<time_type, CharT, InItrT>::default_time_duration_format = time_formats<CharT>::default_time_duration_format;
|
||||
|
||||
|
||||
} } // namespaces
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define DATE_TIME_TIME_ITERATOR_HPP___
|
||||
|
||||
/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
* Author: Jeff Garland, Bart Garst
|
||||
@@ -12,40 +12,40 @@
|
||||
|
||||
namespace boost {
|
||||
namespace date_time {
|
||||
|
||||
|
||||
|
||||
//! Simple time iterator skeleton class
|
||||
template<class time_type>
|
||||
class time_itr {
|
||||
public:
|
||||
typedef typename time_type::time_duration_type time_duration_type;
|
||||
time_itr(time_type t, time_duration_type d) : current_(t), offset_(d) {};
|
||||
time_itr& operator++()
|
||||
time_itr(time_type t, time_duration_type d) : current_(t), offset_(d) {}
|
||||
time_itr& operator++()
|
||||
{
|
||||
current_ = current_ + offset_;
|
||||
return *this;
|
||||
}
|
||||
time_itr& operator--()
|
||||
time_itr& operator--()
|
||||
{
|
||||
current_ = current_ - offset_;
|
||||
return *this;
|
||||
}
|
||||
time_type operator*() {return current_;};
|
||||
time_type* operator->() {return ¤t_;};
|
||||
bool operator< (const time_type& t) {return current_ < t;};
|
||||
bool operator<= (const time_type& t) {return current_ <= t;};
|
||||
bool operator!= (const time_type& t) {return current_ != t;};
|
||||
bool operator== (const time_type& t) {return current_ == t;};
|
||||
bool operator> (const time_type& t) {return current_ > t;};
|
||||
bool operator>= (const time_type& t) {return current_ >= t;};
|
||||
|
||||
const time_type& operator*() const {return current_;}
|
||||
const time_type* operator->() const {return ¤t_;}
|
||||
bool operator< (const time_type& t) const {return current_ < t;}
|
||||
bool operator<= (const time_type& t) const {return current_ <= t;}
|
||||
bool operator!= (const time_type& t) const {return current_ != t;}
|
||||
bool operator== (const time_type& t) const {return current_ == t;}
|
||||
bool operator> (const time_type& t) const {return current_ > t;}
|
||||
bool operator>= (const time_type& t) const {return current_ >= t;}
|
||||
|
||||
private:
|
||||
time_type current_;
|
||||
time_duration_type offset_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
} }//namespace date_time
|
||||
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include "boost/tokenizer.hpp"
|
||||
#include "boost/lexical_cast.hpp"
|
||||
#include "boost/date_time/date_parsing.hpp"
|
||||
#include "boost/date_time/special_values_parser.hpp"
|
||||
#include "boost/cstdint.hpp"
|
||||
#include <iostream>
|
||||
|
||||
@@ -20,7 +21,7 @@ namespace date_time {
|
||||
|
||||
//! computes exponential math like 2^8 => 256, only works with positive integers
|
||||
//Not general purpose, but needed b/c std::pow is not available
|
||||
//everywehere. Hasn't been tested with negatives and zeros
|
||||
//everywhere. Hasn't been tested with negatives and zeros
|
||||
template<class int_type>
|
||||
inline
|
||||
int_type power(int_type base, int_type exponent)
|
||||
@@ -78,7 +79,7 @@ namespace date_time {
|
||||
case 2: {
|
||||
sec = boost::lexical_cast<unsigned short>(*beg);
|
||||
break;
|
||||
};
|
||||
}
|
||||
case 3: {
|
||||
int digits = static_cast<int>(beg->length());
|
||||
//Works around a bug in MSVC 6 library that does not support
|
||||
@@ -116,6 +117,7 @@ namespace date_time {
|
||||
|
||||
break;
|
||||
}
|
||||
default: break;
|
||||
}//switch
|
||||
pos++;
|
||||
}
|
||||
@@ -153,9 +155,10 @@ namespace date_time {
|
||||
std::string& first,
|
||||
std::string& second)
|
||||
{
|
||||
int sep_pos = static_cast<int>(s.find(sep));
|
||||
std::string::size_type sep_pos = s.find(sep);
|
||||
first = s.substr(0,sep_pos);
|
||||
second = s.substr(sep_pos+1);
|
||||
if (sep_pos!=std::string::npos)
|
||||
second = s.substr(sep_pos+1);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -180,7 +183,7 @@ namespace date_time {
|
||||
|
||||
}
|
||||
|
||||
//! Parse time duration part of an iso time of form: [-]hhmmss[.fff...] (eg: 120259.123 is 12 hours, 2 min, 59 seconds, 123000 microseconds)
|
||||
//! Parse time duration part of an ISO 8601 time of form: [-]hhmmss[.fff...] (eg: 120259.123 is 12 hours, 2 min, 59 seconds, 123000 microseconds)
|
||||
template<class time_duration>
|
||||
inline
|
||||
time_duration
|
||||
@@ -280,7 +283,8 @@ namespace date_time {
|
||||
|
||||
break;
|
||||
}
|
||||
};
|
||||
default: break;
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
if(sign) {
|
||||
@@ -299,6 +303,25 @@ namespace date_time {
|
||||
{
|
||||
typedef typename time_type::time_duration_type time_duration;
|
||||
typedef typename time_type::date_type date_type;
|
||||
typedef special_values_parser<date_type, std::string::value_type> svp_type;
|
||||
|
||||
// given to_iso_string can produce a special value string
|
||||
// then from_iso_string should be able to read a special value string
|
||||
// the special_values_parser is expensive to set up and not thread-safe
|
||||
// so it cannot be static, so we need to be careful about when we use it
|
||||
if (svp_type::should_call_match(s)) {
|
||||
typedef typename svp_type::stringstream_type ss_type;
|
||||
typedef typename svp_type::stream_itr_type itr_type;
|
||||
typedef typename svp_type::match_results mr_type;
|
||||
svp_type p; // expensive
|
||||
mr_type mr;
|
||||
ss_type ss(s);
|
||||
itr_type itr(ss);
|
||||
itr_type end;
|
||||
if (p.match(itr, end, mr)) {
|
||||
return time_type(static_cast<special_values>(mr.current_match));
|
||||
}
|
||||
}
|
||||
|
||||
//split date/time on a unique delimiter char such as ' ' or 'T'
|
||||
std::string date_string, tod_string;
|
||||
@@ -311,11 +334,6 @@ namespace date_time {
|
||||
return time_type(d, td);
|
||||
}
|
||||
|
||||
|
||||
|
||||
} }//namespace date_time
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
|
||||
#include <ctime>
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/date_time/time_defs.hpp>
|
||||
#include <boost/date_time/int_adapter.hpp>
|
||||
@@ -22,7 +22,7 @@ namespace date_time {
|
||||
template <typename T>
|
||||
// JDG [7/6/02 made a template],
|
||||
// moved here from time_duration.hpp 2003-Sept-4.
|
||||
inline T absolute_value(T x)
|
||||
inline BOOST_CXX14_CONSTEXPR T absolute_value(T x)
|
||||
{
|
||||
return x < 0 ? -x : x;
|
||||
}
|
||||
@@ -31,35 +31,58 @@ namespace date_time {
|
||||
struct time_resolution_traits_bi32_impl {
|
||||
typedef boost::int32_t int_type;
|
||||
typedef boost::int32_t impl_type;
|
||||
static int_type as_number(impl_type i){ return i;}
|
||||
static BOOST_CXX14_CONSTEXPR int_type as_number(impl_type i){ return i;}
|
||||
//! Used to determine if implemented type is int_adapter or int
|
||||
static bool is_adapted() { return false;}
|
||||
static BOOST_CXX14_CONSTEXPR bool is_adapted() { return false;}
|
||||
};
|
||||
//! traits struct for time_resolution_traits implementation type
|
||||
struct time_resolution_traits_adapted32_impl {
|
||||
typedef boost::int32_t int_type;
|
||||
typedef boost::date_time::int_adapter<boost::int32_t> impl_type;
|
||||
static int_type as_number(impl_type i){ return i.as_number();}
|
||||
static BOOST_CXX14_CONSTEXPR int_type as_number(impl_type i){ return i.as_number();}
|
||||
//! Used to determine if implemented type is int_adapter or int
|
||||
static bool is_adapted() { return true;}
|
||||
static BOOST_CXX14_CONSTEXPR bool is_adapted() { return true;}
|
||||
};
|
||||
//! traits struct for time_resolution_traits implementation type
|
||||
struct time_resolution_traits_bi64_impl {
|
||||
typedef boost::int64_t int_type;
|
||||
typedef boost::int64_t impl_type;
|
||||
static int_type as_number(impl_type i){ return i;}
|
||||
static BOOST_CXX14_CONSTEXPR int_type as_number(impl_type i){ return i;}
|
||||
//! Used to determine if implemented type is int_adapter or int
|
||||
static bool is_adapted() { return false;}
|
||||
static BOOST_CXX14_CONSTEXPR bool is_adapted() { return false;}
|
||||
};
|
||||
//! traits struct for time_resolution_traits implementation type
|
||||
struct time_resolution_traits_adapted64_impl {
|
||||
typedef boost::int64_t int_type;
|
||||
typedef boost::date_time::int_adapter<boost::int64_t> impl_type;
|
||||
static int_type as_number(impl_type i){ return i.as_number();}
|
||||
static BOOST_CXX14_CONSTEXPR int_type as_number(impl_type i){ return i.as_number();}
|
||||
//! Used to determine if implemented type is int_adapter or int
|
||||
static bool is_adapted() { return true;}
|
||||
static BOOST_CXX14_CONSTEXPR bool is_adapted() { return true;}
|
||||
};
|
||||
|
||||
//
|
||||
// Note about var_type, which is used to define the variable that
|
||||
// stores hours, minutes, and seconds values:
|
||||
//
|
||||
// In Boost 1.65.1 and earlier var_type was boost::int32_t which suffers
|
||||
// the year 2038 problem. Binary serialization of posix_time uses
|
||||
// 32-bit values, and uses serialization version 0.
|
||||
//
|
||||
// In Boost 1.66.0 the var_type changed to std::time_t, however
|
||||
// binary serialization was not properly versioned, so on platforms
|
||||
// where std::time_t is 32-bits, it remains compatible, however on
|
||||
// platforms where std::time_t is 64-bits, binary serialization ingest
|
||||
// will be incompatible with previous versions. Furthermore, binary
|
||||
// serialized output from 1.66.0 will not be compatible with future
|
||||
// versions. Yes, it's a mess. Static assertions were not present
|
||||
// in the serialization code to protect against this possibility.
|
||||
//
|
||||
// In Boost 1.67.0 the var_type was changed to boost::int64_t,
|
||||
// ensuring the output size is 64 bits, and the serialization version
|
||||
// was bumped. Static assertions were added as well, protecting
|
||||
// future changes in this area.
|
||||
//
|
||||
|
||||
template<typename frac_sec_type,
|
||||
time_resolutions res,
|
||||
#if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
|
||||
@@ -68,23 +91,23 @@ namespace date_time {
|
||||
typename frac_sec_type::int_type resolution_adjust,
|
||||
#endif
|
||||
unsigned short frac_digits,
|
||||
typename v_type = boost::int32_t >
|
||||
typename var_type = boost::int64_t > // see note above
|
||||
class time_resolution_traits {
|
||||
public:
|
||||
typedef typename frac_sec_type::int_type fractional_seconds_type;
|
||||
typedef typename frac_sec_type::int_type tick_type;
|
||||
typedef typename frac_sec_type::impl_type impl_type;
|
||||
typedef v_type day_type;
|
||||
typedef v_type hour_type;
|
||||
typedef v_type min_type;
|
||||
typedef v_type sec_type;
|
||||
typedef var_type day_type;
|
||||
typedef var_type hour_type;
|
||||
typedef var_type min_type;
|
||||
typedef var_type sec_type;
|
||||
|
||||
// bring in function from frac_sec_type traits structs
|
||||
static fractional_seconds_type as_number(impl_type i)
|
||||
static BOOST_CXX14_CONSTEXPR fractional_seconds_type as_number(impl_type i)
|
||||
{
|
||||
return frac_sec_type::as_number(i);
|
||||
}
|
||||
static bool is_adapted()
|
||||
static BOOST_CXX14_CONSTEXPR bool is_adapted()
|
||||
{
|
||||
return frac_sec_type::is_adapted();
|
||||
}
|
||||
@@ -96,23 +119,23 @@ namespace date_time {
|
||||
BOOST_STATIC_CONSTANT(fractional_seconds_type, ticks_per_second = resolution_adjust);
|
||||
#endif
|
||||
|
||||
static time_resolutions resolution()
|
||||
static BOOST_CXX14_CONSTEXPR time_resolutions resolution()
|
||||
{
|
||||
return res;
|
||||
}
|
||||
static unsigned short num_fractional_digits()
|
||||
static BOOST_CXX14_CONSTEXPR unsigned short num_fractional_digits()
|
||||
{
|
||||
return frac_digits;
|
||||
}
|
||||
static fractional_seconds_type res_adjust()
|
||||
static BOOST_CXX14_CONSTEXPR fractional_seconds_type res_adjust()
|
||||
{
|
||||
return resolution_adjust;
|
||||
}
|
||||
//! Any negative argument results in a negative tick_count
|
||||
static tick_type to_tick_count(hour_type hours,
|
||||
min_type minutes,
|
||||
sec_type seconds,
|
||||
fractional_seconds_type fs)
|
||||
static BOOST_CXX14_CONSTEXPR tick_type to_tick_count(hour_type hours,
|
||||
min_type minutes,
|
||||
sec_type seconds,
|
||||
fractional_seconds_type fs)
|
||||
{
|
||||
if(hours < 0 || minutes < 0 || seconds < 0 || fs < 0)
|
||||
{
|
||||
@@ -120,14 +143,14 @@ namespace date_time {
|
||||
minutes = absolute_value(minutes);
|
||||
seconds = absolute_value(seconds);
|
||||
fs = absolute_value(fs);
|
||||
return (((((fractional_seconds_type(hours)*3600)
|
||||
+ (fractional_seconds_type(minutes)*60)
|
||||
+ seconds)*res_adjust()) + fs) * -1);
|
||||
return static_cast<tick_type>(((((fractional_seconds_type(hours)*3600)
|
||||
+ (fractional_seconds_type(minutes)*60)
|
||||
+ seconds)*res_adjust()) + fs) * -1);
|
||||
}
|
||||
|
||||
return (((fractional_seconds_type(hours)*3600)
|
||||
+ (fractional_seconds_type(minutes)*60)
|
||||
+ seconds)*res_adjust()) + fs;
|
||||
return static_cast<tick_type>((((fractional_seconds_type(hours)*3600)
|
||||
+ (fractional_seconds_type(minutes)*60)
|
||||
+ seconds)*res_adjust()) + fs);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user