mirror of
https://github.com/boostorg/date_time.git
synced 2026-07-21 13:13:29 +00:00
Compare commits
170 Commits
| 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 |
+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
-102
@@ -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,175 +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;4","+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;4","+03:00:00"
|
||||
"Australia/Darwin","CST","CST","","","+09:30:00","+00:00:00","","","","+00:00:00"
|
||||
"Australia/Eucla","CWST","CWST","","","+08:45: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;4","+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;4","+02:30:00"
|
||||
"Australia/Melbourne","EST","EST","EST","EST","+10:00:00","+01:00:00","1;0;10","+02:00:00","1;0;4","+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;4","+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"
|
||||
@@ -290,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"
|
||||
@@ -304,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"
|
||||
@@ -342,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"
|
||||
@@ -365,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"
|
||||
|
||||
|
@@ -4,6 +4,8 @@
|
||||
# (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
|
||||
|
||||
+8
-11
@@ -1,8 +1,4 @@
|
||||
project libs/date_time/example
|
||||
: requirements
|
||||
<link>static:<define>BOOST_DATE_TIME_STATIC_LINK
|
||||
<library>../build//boost_date_time
|
||||
;
|
||||
project : requirements <library>/boost/date_time//boost_date_time ;
|
||||
|
||||
exe dates_as_strings : gregorian/dates_as_strings.cpp ;
|
||||
exe days_alive : gregorian/days_alive.cpp ;
|
||||
@@ -20,20 +16,21 @@ exe period_calc : gregorian/period_calc.cpp ;
|
||||
|
||||
exe days_since_year_start : gregorian/days_since_year_start.cpp ;
|
||||
|
||||
|
||||
exe local_utc_conversion : posix_time/local_utc_conversion.cpp
|
||||
: <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
: <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
;
|
||||
|
||||
exe print_hours : posix_time/print_hours.cpp
|
||||
: <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
: <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
;
|
||||
|
||||
exe time_math : posix_time/time_math.cpp
|
||||
: <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
: <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
;
|
||||
|
||||
exe time_periods : posix_time/time_periods.cpp
|
||||
: <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
: <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
;
|
||||
|
||||
exe simple_time_zone : local_time/simple_time_zone.cpp ;
|
||||
@@ -44,7 +41,7 @@ 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;
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -22,10 +22,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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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,12 +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 = static_cast<std::time_t>(dd.days())*86400 +
|
||||
static_cast<std::time_t>(td.hours())*3600 +
|
||||
static_cast<std::time_t>(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));
|
||||
|
||||
@@ -90,10 +90,13 @@ namespace date_time {
|
||||
}
|
||||
#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)
|
||||
@@ -112,9 +115,11 @@ 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_DATE_TIME_HAS_REENTRANT_STD_FUNCTIONS
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -136,26 +119,6 @@ namespace std {
|
||||
# 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__)
|
||||
@@ -165,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 {
|
||||
@@ -43,25 +43,29 @@ namespace CV {
|
||||
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....
|
||||
@@ -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());
|
||||
|
||||
@@ -21,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>
|
||||
@@ -68,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())
|
||||
{
|
||||
@@ -154,7 +154,7 @@ 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())
|
||||
{
|
||||
@@ -162,17 +162,17 @@ namespace date_time {
|
||||
}
|
||||
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())
|
||||
{
|
||||
@@ -180,7 +180,7 @@ namespace date_time {
|
||||
}
|
||||
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_);
|
||||
@@ -192,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_;
|
||||
|
||||
};
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#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 {
|
||||
@@ -33,46 +34,44 @@ namespace date_time {
|
||||
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_;
|
||||
}
|
||||
@@ -83,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;
|
||||
}
|
||||
@@ -126,7 +125,7 @@ namespace date_time {
|
||||
{
|
||||
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
|
||||
@@ -136,7 +135,7 @@ namespace date_time {
|
||||
{
|
||||
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(); }
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -22,9 +22,9 @@ namespace date_time {
|
||||
template <class 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) {}
|
||||
};
|
||||
|
||||
@@ -49,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;
|
||||
};
|
||||
@@ -171,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);
|
||||
}
|
||||
@@ -196,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>
|
||||
@@ -316,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]);
|
||||
@@ -763,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,6 +52,7 @@ 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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
@@ -38,7 +38,7 @@ namespace date_time {
|
||||
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.
|
||||
@@ -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;
|
||||
@@ -139,7 +139,7 @@ namespace date_time {
|
||||
* 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_);
|
||||
@@ -153,9 +153,18 @@ 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
|
||||
@@ -167,7 +176,7 @@ namespace date_time {
|
||||
* 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
|
||||
@@ -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,7 +239,7 @@ 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'
|
||||
@@ -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,7 +296,7 @@ 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'
|
||||
@@ -307,7 +316,7 @@ namespace date_time {
|
||||
/*! 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,7 +357,7 @@ 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'
|
||||
@@ -502,8 +511,4 @@ namespace date_time {
|
||||
|
||||
} } //namespace date_time
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -53,14 +53,14 @@ namespace date_time {
|
||||
}
|
||||
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_;
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,15 +358,15 @@ 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&)
|
||||
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 utc_is_dst(const date_type&,
|
||||
const time_duration_type&)
|
||||
{
|
||||
return is_not_in_dst;
|
||||
}
|
||||
@@ -376,7 +376,7 @@ namespace boost {
|
||||
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 {
|
||||
@@ -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_HAS_GETSYSTEMTIMEASFILETIME)
|
||||
GetSystemTimeAsFileTime(&ft);
|
||||
#else
|
||||
system_time st;
|
||||
GetSystemTime(&st);
|
||||
SystemTimeToFileTime(&st, &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);
|
||||
@@ -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
|
||||
@@ -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; }
|
||||
|
||||
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 == '%') {
|
||||
if ( ++itr == format_str.end())
|
||||
break;
|
||||
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);
|
||||
@@ -294,10 +294,10 @@ class format_date_parser
|
||||
}
|
||||
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);
|
||||
@@ -313,7 +313,7 @@ class format_date_parser
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'b':
|
||||
case 'b':
|
||||
{
|
||||
match_results mr = m_month_short_names.match(sitr, stream_end);
|
||||
if(mr.current_match == match_results::PARSE_ERROR) {
|
||||
@@ -328,7 +328,7 @@ class format_date_parser
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'B':
|
||||
case 'B':
|
||||
{
|
||||
match_results mr = m_month_long_names.match(sitr, stream_end);
|
||||
if(mr.current_match == match_results::PARSE_ERROR) {
|
||||
@@ -343,7 +343,7 @@ class format_date_parser
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'd':
|
||||
case 'd':
|
||||
{
|
||||
match_results mr;
|
||||
day = fixed_string_to_int<short, charT>(sitr, stream_end, mr, 2);
|
||||
@@ -355,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, ' ');
|
||||
@@ -367,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);
|
||||
@@ -381,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);
|
||||
@@ -393,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);
|
||||
@@ -405,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);
|
||||
@@ -420,14 +420,14 @@ 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
|
||||
@@ -440,48 +440,48 @@ class format_date_parser
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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; }
|
||||
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 == '%') {
|
||||
if ( ++itr == format_str.end())
|
||||
break;
|
||||
break;
|
||||
if (*itr != '%') {
|
||||
switch(*itr) {
|
||||
case 'b':
|
||||
case 'b':
|
||||
{
|
||||
mr = m_month_short_names.match(sitr, stream_end);
|
||||
month = mr.current_match;
|
||||
@@ -490,7 +490,7 @@ class format_date_parser
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'B':
|
||||
case 'B':
|
||||
{
|
||||
mr = m_month_long_names.match(sitr, stream_end);
|
||||
month = mr.current_match;
|
||||
@@ -499,23 +499,23 @@ class format_date_parser
|
||||
}
|
||||
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
|
||||
@@ -528,27 +528,27 @@ class format_date_parser
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
@@ -556,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
|
||||
{
|
||||
@@ -564,29 +564,29 @@ 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; }
|
||||
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 == '%') {
|
||||
if ( ++itr == format_str.end())
|
||||
break;
|
||||
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);
|
||||
@@ -596,10 +596,10 @@ class format_date_parser
|
||||
}
|
||||
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);
|
||||
@@ -617,14 +617,14 @@ 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
|
||||
@@ -637,14 +637,14 @@ class format_date_parser
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
@@ -654,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; }
|
||||
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 == '%') {
|
||||
if ( ++itr == format_str.end())
|
||||
break;
|
||||
break;
|
||||
if (*itr != '%') {
|
||||
//match_results mr;
|
||||
switch(*itr) {
|
||||
@@ -689,31 +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;
|
||||
}
|
||||
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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
@@ -48,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) {
|
||||
@@ -61,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)
|
||||
@@ -42,9 +42,9 @@ namespace gregorian {
|
||||
*/
|
||||
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:
|
||||
|
||||
};
|
||||
|
||||
@@ -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)
|
||||
@@ -32,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)
|
||||
{}
|
||||
|
||||
@@ -49,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;
|
||||
|
||||
|
||||
@@ -31,9 +31,9 @@ namespace gregorian {
|
||||
|
||||
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) {}
|
||||
};
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#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
|
||||
@@ -75,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;
|
||||
@@ -142,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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
@@ -11,13 +11,9 @@
|
||||
|
||||
#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 <stdexcept>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <algorithm>
|
||||
#include <cctype>
|
||||
|
||||
namespace boost {
|
||||
namespace gregorian {
|
||||
@@ -39,7 +35,7 @@ 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 BOOST_SYMBOL_VISIBLE bad_month : public std::out_of_range
|
||||
{
|
||||
@@ -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,27 +11,8 @@
|
||||
|
||||
#include "boost/date_time/gregorian/gregorian_types.hpp"
|
||||
#include "boost/date_time/gregorian/parsers.hpp"
|
||||
#include "boost/serialization/split_free.hpp"
|
||||
#include "boost/serialization/nvp.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_year)
|
||||
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 {
|
||||
|
||||
@@ -41,15 +22,36 @@ namespace boost {
|
||||
|
||||
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.
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -21,26 +21,26 @@ namespace gregorian {
|
||||
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 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_;}
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -20,10 +20,10 @@ 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 BOOST_SYMBOL_VISIBLE gregorian_calendar_base {
|
||||
@@ -40,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();
|
||||
|
||||
};
|
||||
|
||||
@@ -60,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));
|
||||
@@ -71,14 +69,15 @@ 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;
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -86,7 +85,8 @@ namespace date_time {
|
||||
/*! 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())
|
||||
@@ -233,6 +234,7 @@ public:
|
||||
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())
|
||||
@@ -281,6 +283,8 @@ public:
|
||||
}
|
||||
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:
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -315,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
|
||||
{
|
||||
@@ -349,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
|
||||
|
||||
@@ -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,10 +87,19 @@ 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 suppress warnings
|
||||
boost::uint32_t sub_sec = static_cast<boost::uint32_t>(micros % 1000000UL);
|
||||
@@ -115,6 +126,26 @@ namespace date_time {
|
||||
|
||||
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
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -58,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_;
|
||||
@@ -87,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),
|
||||
@@ -98,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())
|
||||
@@ -107,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_;
|
||||
@@ -115,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();
|
||||
@@ -123,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_;
|
||||
@@ -131,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_;
|
||||
@@ -139,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
|
||||
@@ -152,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_) &&
|
||||
@@ -161,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_);
|
||||
@@ -170,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;
|
||||
@@ -197,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;
|
||||
@@ -206,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_) &&
|
||||
@@ -216,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_));
|
||||
@@ -233,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());
|
||||
@@ -252,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())
|
||||
{
|
||||
@@ -274,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())
|
||||
{
|
||||
@@ -299,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
|
||||
{
|
||||
@@ -334,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
|
||||
{
|
||||
@@ -361,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;
|
||||
}
|
||||
void delimiter_strings(const string_type& ,
|
||||
const string_type& ,
|
||||
const string_type& ,
|
||||
const string_type& )
|
||||
{
|
||||
m_period_separator;
|
||||
m_period_start_delimeter;
|
||||
m_open_range_end_delimeter;
|
||||
m_closed_range_end_delimeter;
|
||||
}
|
||||
|
||||
//! 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 = 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
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
*/
|
||||
|
||||
#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>
|
||||
@@ -21,21 +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)
|
||||
{
|
||||
time_duration dur = pt - ptime(gregorian::date(1970,1,1));
|
||||
return std::time_t(dur.total_seconds());
|
||||
return (pt - ptime(gregorian::date(1970,1,1))).total_seconds();
|
||||
}
|
||||
|
||||
//! Convert a time to a tm structure truncating any fractional seconds
|
||||
@@ -43,9 +41,9 @@ 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;
|
||||
}
|
||||
@@ -54,9 +52,9 @@ namespace posix_time {
|
||||
std::tm to_tm(const boost::posix_time::time_duration& td) {
|
||||
std::tm timetm;
|
||||
std::memset(&timetm, 0, sizeof(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());
|
||||
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;
|
||||
}
|
||||
@@ -82,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
|
||||
|
||||
@@ -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,32 +22,19 @@
|
||||
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
|
||||
|
||||
|
||||
@@ -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>;
|
||||
protected:
|
||||
explicit time_duration(impl_type tick_count) :
|
||||
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,19 +103,19 @@ 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());
|
||||
}
|
||||
|
||||
@@ -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,42 +9,54 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#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 BOOST_SYMBOL_VISIBLE hours : public time_duration
|
||||
{
|
||||
public:
|
||||
explicit hours(long h) :
|
||||
time_duration(static_cast<hour_type>(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 BOOST_SYMBOL_VISIBLE minutes : public time_duration
|
||||
{
|
||||
public:
|
||||
explicit minutes(long m) :
|
||||
time_duration(0,static_cast<min_type>(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 BOOST_SYMBOL_VISIBLE seconds : public time_duration
|
||||
{
|
||||
public:
|
||||
explicit seconds(long s) :
|
||||
time_duration(0,0,static_cast<sec_type>(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))
|
||||
{}
|
||||
};
|
||||
|
||||
@@ -70,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
|
||||
|
||||
|
||||
|
||||
@@ -74,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);
|
||||
@@ -97,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);
|
||||
}
|
||||
}
|
||||
@@ -141,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);
|
||||
@@ -205,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);
|
||||
|
||||
@@ -37,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
|
||||
|
||||
@@ -36,6 +36,10 @@ namespace posix_time {
|
||||
}
|
||||
|
||||
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');
|
||||
}
|
||||
|
||||
|
||||
@@ -11,20 +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/serialization/nvp.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 ***/
|
||||
|
||||
@@ -33,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();
|
||||
@@ -46,14 +84,13 @@ void save(Archive & ar,
|
||||
ar & make_nvp("sv_time_duration", s);
|
||||
}
|
||||
else {
|
||||
posix_time::time_duration::hour_type h = td.hours();
|
||||
posix_time::time_duration::min_type m = td.minutes();
|
||||
posix_time::time_duration::sec_type s = 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);
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,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);
|
||||
@@ -76,15 +127,25 @@ void load(Archive & ar,
|
||||
td = posix_time::time_duration(sv);
|
||||
}
|
||||
else {
|
||||
posix_time::time_duration::hour_type h(0);
|
||||
posix_time::time_duration::min_type m(0);
|
||||
posix_time::time_duration::sec_type 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);
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -50,7 +52,7 @@ gather_month_strings(const std::locale& locale, bool short_strings=true)
|
||||
//output each month
|
||||
const charT* p_outfmt = outfmt.c_str(), *p_outfmt_end = p_outfmt + outfmt.size();
|
||||
tm tm_value;
|
||||
memset(&tm_value, 0, sizeof(tm_value));
|
||||
std::memset(&tm_value, 0, sizeof(tm_value));
|
||||
for (int m=0; m < 12; m++) {
|
||||
tm_value.tm_mon = m;
|
||||
stringstream_type ss;
|
||||
@@ -103,7 +105,7 @@ gather_weekday_strings(const std::locale& locale, bool short_strings=true)
|
||||
//output each month / weekday
|
||||
const charT* p_outfmt = outfmt.c_str(), *p_outfmt_end = p_outfmt + outfmt.size();
|
||||
tm tm_value;
|
||||
memset(&tm_value, 0, sizeof(tm_value));
|
||||
std::memset(&tm_value, 0, sizeof(tm_value));
|
||||
for (int i=0; i < 7; i++) {
|
||||
tm_value.tm_wday = i;
|
||||
stringstream_type 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)
|
||||
@@ -58,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_);
|
||||
@@ -98,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_);
|
||||
}
|
||||
|
||||
|
||||
@@ -9,12 +9,14 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include <boost/core/enable_if.hpp>
|
||||
#include <boost/cstdint.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/date_time/time_defs.hpp>
|
||||
#include <boost/date_time/special_defs.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/type_traits/is_integral.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace date_time {
|
||||
@@ -27,8 +29,8 @@ 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 BOOST_SYMBOL_VISIBLE time_duration : private
|
||||
@@ -54,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());
|
||||
@@ -113,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());
|
||||
@@ -121,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());
|
||||
@@ -129,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())
|
||||
{
|
||||
@@ -214,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())
|
||||
{
|
||||
@@ -225,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())
|
||||
{
|
||||
@@ -236,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())
|
||||
{
|
||||
@@ -248,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_;
|
||||
};
|
||||
|
||||
@@ -262,7 +275,7 @@ 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 BOOST_SYMBOL_VISIBLE subsecond_duration : public base_duration
|
||||
@@ -278,14 +291,16 @@ namespace date_time {
|
||||
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:
|
||||
explicit subsecond_duration(boost::int64_t ss) :
|
||||
// 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,13 +11,13 @@
|
||||
*/
|
||||
|
||||
#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>
|
||||
@@ -269,11 +269,11 @@ 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;
|
||||
}
|
||||
@@ -409,7 +409,7 @@ namespace date_time {
|
||||
// replace %F with nnnnnnn or nothing if fs == 0
|
||||
frac_str =
|
||||
fractional_seconds_as_string(time_arg.time_of_day(), true);
|
||||
if (frac_str.size()) {
|
||||
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;
|
||||
@@ -481,7 +481,7 @@ namespace date_time {
|
||||
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())
|
||||
@@ -866,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
|
||||
@@ -957,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';
|
||||
@@ -1088,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;
|
||||
@@ -1136,6 +1140,7 @@ namespace date_time {
|
||||
// %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
|
||||
@@ -1227,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);
|
||||
@@ -1250,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 + "'"));
|
||||
@@ -1360,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
|
||||
|
||||
|
||||
@@ -30,14 +30,14 @@ namespace date_time {
|
||||
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_;
|
||||
|
||||
@@ -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
|
||||
@@ -182,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
|
||||
@@ -283,7 +284,7 @@ namespace date_time {
|
||||
break;
|
||||
}
|
||||
default: break;
|
||||
};
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
if(sign) {
|
||||
@@ -302,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;
|
||||
@@ -314,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,7 +91,7 @@ namespace date_time {
|
||||
typename frac_sec_type::int_type resolution_adjust,
|
||||
#endif
|
||||
unsigned short frac_digits,
|
||||
typename var_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;
|
||||
@@ -80,11 +103,11 @@ namespace date_time {
|
||||
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);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define DATE_TIME_TIME_SYSTEM_COUNTED_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
|
||||
@@ -10,8 +10,9 @@
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "boost/date_time/time_defs.hpp"
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/time_defs.hpp>
|
||||
#include <boost/date_time/special_defs.hpp>
|
||||
#include <string>
|
||||
|
||||
|
||||
@@ -30,24 +31,28 @@ namespace date_time {
|
||||
typedef typename date_type::ymd_type ymd_type;
|
||||
typedef typename config::time_duration_type time_duration_type;
|
||||
typedef typename config::resolution_traits resolution_traits;
|
||||
|
||||
counted_time_rep(const date_type& d, const time_duration_type& time_of_day)
|
||||
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
counted_time_rep(const date_type& d, const time_duration_type& time_of_day)
|
||||
: time_count_(1)
|
||||
{
|
||||
if(d.is_infinity() || d.is_not_a_date() || time_of_day.is_special()) {
|
||||
time_count_ = time_of_day.get_rep() + d.day_count();
|
||||
//std::cout << time_count_ << std::endl;
|
||||
}
|
||||
else {
|
||||
else {
|
||||
time_count_ = (d.day_number() * frac_sec_per_day()) + time_of_day.ticks();
|
||||
}
|
||||
}
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
explicit counted_time_rep(int_type count) :
|
||||
time_count_(count)
|
||||
{}
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
explicit counted_time_rep(impl_type count) :
|
||||
time_count_(count)
|
||||
{}
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
date_type date() const
|
||||
{
|
||||
if(time_count_.is_special()) {
|
||||
@@ -61,53 +66,54 @@ namespace date_time {
|
||||
}
|
||||
}
|
||||
//int_type day_count() const
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
unsigned long day_count() const
|
||||
{
|
||||
/* resolution_traits::as_number returns a boost::int64_t &
|
||||
* frac_sec_per_day is also a boost::int64_t so, naturally,
|
||||
* the division operation returns a boost::int64_t.
|
||||
* The static_cast to an unsigned long is ok (results in no data loss)
|
||||
* because frac_sec_per_day is either the number of
|
||||
* microseconds per day, or the number of nanoseconds per day.
|
||||
* Worst case scenario: resolution_traits::as_number returns the
|
||||
* maximum value an int64_t can hold and frac_sec_per_day
|
||||
* is microseconds per day (lowest possible value).
|
||||
* The division operation will then return a value of 106751991 -
|
||||
* easily fitting in an unsigned long.
|
||||
/* resolution_traits::as_number returns a boost::int64_t &
|
||||
* frac_sec_per_day is also a boost::int64_t so, naturally,
|
||||
* the division operation returns a boost::int64_t.
|
||||
* The static_cast to an unsigned long is ok (results in no data loss)
|
||||
* because frac_sec_per_day is either the number of
|
||||
* microseconds per day, or the number of nanoseconds per day.
|
||||
* Worst case scenario: resolution_traits::as_number returns the
|
||||
* maximum value an int64_t can hold and frac_sec_per_day
|
||||
* is microseconds per day (lowest possible value).
|
||||
* The division operation will then return a value of 106751991 -
|
||||
* easily fitting in an unsigned long.
|
||||
*/
|
||||
return static_cast<unsigned long>(resolution_traits::as_number(time_count_) / frac_sec_per_day());
|
||||
}
|
||||
int_type time_count() const
|
||||
BOOST_CXX14_CONSTEXPR int_type time_count() const
|
||||
{
|
||||
return resolution_traits::as_number(time_count_);
|
||||
}
|
||||
int_type tod() const
|
||||
BOOST_CXX14_CONSTEXPR int_type tod() const
|
||||
{
|
||||
return resolution_traits::as_number(time_count_) % frac_sec_per_day();
|
||||
}
|
||||
static int_type frac_sec_per_day()
|
||||
static BOOST_CXX14_CONSTEXPR int_type frac_sec_per_day()
|
||||
{
|
||||
int_type seconds_per_day = 60*60*24;
|
||||
int_type fractional_sec_per_sec(resolution_traits::res_adjust());
|
||||
return seconds_per_day*fractional_sec_per_sec;
|
||||
}
|
||||
bool is_pos_infinity()const
|
||||
BOOST_CXX14_CONSTEXPR bool is_pos_infinity()const
|
||||
{
|
||||
return impl_type::is_pos_inf(time_count_.as_number());
|
||||
}
|
||||
bool is_neg_infinity()const
|
||||
BOOST_CXX14_CONSTEXPR bool is_neg_infinity()const
|
||||
{
|
||||
return impl_type::is_neg_inf(time_count_.as_number());
|
||||
}
|
||||
bool is_not_a_date_time()const
|
||||
BOOST_CXX14_CONSTEXPR bool is_not_a_date_time()const
|
||||
{
|
||||
return impl_type::is_not_a_number(time_count_.as_number());
|
||||
}
|
||||
bool is_special()const
|
||||
BOOST_CXX14_CONSTEXPR bool is_special()const
|
||||
{
|
||||
return time_count_.is_special();
|
||||
}
|
||||
impl_type get_rep()const
|
||||
BOOST_CXX14_CONSTEXPR impl_type get_rep()const
|
||||
{
|
||||
return time_count_;
|
||||
}
|
||||
@@ -128,27 +134,28 @@ namespace date_time {
|
||||
typedef typename time_rep_type::date_duration_type date_duration_type;
|
||||
|
||||
|
||||
template<class T> static void unused_var(const T&) {}
|
||||
template<class T> static BOOST_CXX14_CONSTEXPR void unused_var(const T&) {}
|
||||
|
||||
static time_rep_type get_time_rep(const date_type& day,
|
||||
const time_duration_type& tod,
|
||||
date_time::dst_flags dst=not_dst)
|
||||
static BOOST_CXX14_CONSTEXPR
|
||||
time_rep_type get_time_rep(const date_type& day,
|
||||
const time_duration_type& tod,
|
||||
date_time::dst_flags dst=not_dst)
|
||||
{
|
||||
unused_var(dst);
|
||||
return time_rep_type(day, tod);
|
||||
}
|
||||
|
||||
static time_rep_type get_time_rep(special_values sv)
|
||||
static BOOST_CXX14_CONSTEXPR time_rep_type get_time_rep(special_values sv)
|
||||
{
|
||||
switch (sv) {
|
||||
case not_a_date_time:
|
||||
return time_rep_type(date_type(not_a_date_time),
|
||||
time_duration_type(not_a_date_time));
|
||||
case pos_infin:
|
||||
return time_rep_type(date_type(pos_infin),
|
||||
return time_rep_type(date_type(pos_infin),
|
||||
time_duration_type(pos_infin));
|
||||
case neg_infin:
|
||||
return time_rep_type(date_type(neg_infin),
|
||||
return time_rep_type(date_type(neg_infin),
|
||||
time_duration_type(neg_infin));
|
||||
case max_date_time: {
|
||||
time_duration_type td = time_duration_type(24,0,0,0) - time_duration_type(0,0,0,1);
|
||||
@@ -160,38 +167,42 @@ namespace date_time {
|
||||
default:
|
||||
return time_rep_type(date_type(not_a_date_time),
|
||||
time_duration_type(not_a_date_time));
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static date_type get_date(const time_rep_type& val)
|
||||
static BOOST_CXX14_CONSTEXPR date_type
|
||||
get_date(const time_rep_type& val)
|
||||
{
|
||||
return val.date();
|
||||
}
|
||||
static time_duration_type get_time_of_day(const time_rep_type& val)
|
||||
static BOOST_CXX14_CONSTEXPR
|
||||
time_duration_type get_time_of_day(const time_rep_type& val)
|
||||
{
|
||||
if(val.is_special()) {
|
||||
return time_duration_type(val.get_rep().as_special());
|
||||
}
|
||||
else{
|
||||
return time_duration_type(0,0,0,val.tod());
|
||||
return time_duration_type(0,0,0,val.tod());
|
||||
}
|
||||
}
|
||||
static std::string zone_name(const time_rep_type&)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
static bool is_equal(const time_rep_type& lhs, const time_rep_type& rhs)
|
||||
static BOOST_CXX14_CONSTEXPR bool is_equal(const time_rep_type& lhs, const time_rep_type& rhs)
|
||||
{
|
||||
return (lhs.time_count() == rhs.time_count());
|
||||
}
|
||||
static bool is_less(const time_rep_type& lhs, const time_rep_type& rhs)
|
||||
static BOOST_CXX14_CONSTEXPR
|
||||
bool is_less(const time_rep_type& lhs, const time_rep_type& rhs)
|
||||
{
|
||||
return (lhs.time_count() < rhs.time_count());
|
||||
}
|
||||
static time_rep_type add_days(const time_rep_type& base,
|
||||
const date_duration_type& dd)
|
||||
static BOOST_CXX14_CONSTEXPR
|
||||
time_rep_type add_days(const time_rep_type& base,
|
||||
const date_duration_type& dd)
|
||||
{
|
||||
if(base.is_special() || dd.is_special()) {
|
||||
return(time_rep_type(base.get_rep() + dd.get_rep()));
|
||||
@@ -200,8 +211,9 @@ namespace date_time {
|
||||
return time_rep_type(base.time_count() + (dd.days() * time_rep_type::frac_sec_per_day()));
|
||||
}
|
||||
}
|
||||
static time_rep_type subtract_days(const time_rep_type& base,
|
||||
const date_duration_type& dd)
|
||||
static BOOST_CXX14_CONSTEXPR
|
||||
time_rep_type subtract_days(const time_rep_type& base,
|
||||
const date_duration_type& dd)
|
||||
{
|
||||
if(base.is_special() || dd.is_special()) {
|
||||
return(time_rep_type(base.get_rep() - dd.get_rep()));
|
||||
@@ -210,8 +222,9 @@ namespace date_time {
|
||||
return time_rep_type(base.time_count() - (dd.days() * time_rep_type::frac_sec_per_day()));
|
||||
}
|
||||
}
|
||||
static time_rep_type subtract_time_duration(const time_rep_type& base,
|
||||
const time_duration_type& td)
|
||||
static BOOST_CXX14_CONSTEXPR
|
||||
time_rep_type subtract_time_duration(const time_rep_type& base,
|
||||
const time_duration_type& td)
|
||||
{
|
||||
if(base.is_special() || td.is_special()) {
|
||||
return(time_rep_type(base.get_rep() - td.get_rep()));
|
||||
@@ -220,8 +233,9 @@ namespace date_time {
|
||||
return time_rep_type(base.time_count() - td.ticks());
|
||||
}
|
||||
}
|
||||
static time_rep_type add_time_duration(const time_rep_type& base,
|
||||
time_duration_type td)
|
||||
static BOOST_CXX14_CONSTEXPR
|
||||
time_rep_type add_time_duration(const time_rep_type& base,
|
||||
time_duration_type td)
|
||||
{
|
||||
if(base.is_special() || td.is_special()) {
|
||||
return(time_rep_type(base.get_rep() + td.get_rep()));
|
||||
@@ -230,8 +244,9 @@ namespace date_time {
|
||||
return time_rep_type(base.time_count() + td.ticks());
|
||||
}
|
||||
}
|
||||
static time_duration_type subtract_times(const time_rep_type& lhs,
|
||||
const time_rep_type& rhs)
|
||||
static BOOST_CXX14_CONSTEXPR
|
||||
time_duration_type subtract_times(const time_rep_type& lhs,
|
||||
const time_rep_type& rhs)
|
||||
{
|
||||
if(lhs.is_special() || rhs.is_special()) {
|
||||
return(time_duration_type(
|
||||
@@ -239,10 +254,10 @@ namespace date_time {
|
||||
}
|
||||
else {
|
||||
fractional_seconds_type fs = lhs.time_count() - rhs.time_count();
|
||||
return time_duration_type(0,0,0,fs);
|
||||
return time_duration_type(0,0,0,fs);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define DATE_TIME_TIME_SYSTEM_SPLIT_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
|
||||
@@ -11,14 +11,17 @@
|
||||
|
||||
|
||||
#include <string>
|
||||
#include "boost/date_time/compiler_config.hpp"
|
||||
#include "boost/date_time/special_defs.hpp"
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
#include <boost/date_time/time_defs.hpp>
|
||||
#include <boost/date_time/special_defs.hpp>
|
||||
#include <boost/date_time/wrapping_int.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace date_time {
|
||||
|
||||
//! An unadjusted time system implementation.
|
||||
#if (defined(BOOST_DATE_TIME_NO_MEMBER_INIT))
|
||||
#if (defined(BOOST_DATE_TIME_NO_MEMBER_INIT))
|
||||
template<typename config, boost::int32_t ticks_per_second>
|
||||
#else
|
||||
template<typename config>
|
||||
@@ -34,30 +37,32 @@ namespace date_time {
|
||||
typedef typename config::resolution_traits resolution_traits;
|
||||
|
||||
//86400 is number of seconds in a day...
|
||||
#if (defined(BOOST_DATE_TIME_NO_MEMBER_INIT))
|
||||
#if (defined(BOOST_DATE_TIME_NO_MEMBER_INIT))
|
||||
typedef date_time::wrapping_int<int_type, INT64_C(86400) * ticks_per_second > wrap_int_type;
|
||||
#else
|
||||
private:
|
||||
BOOST_STATIC_CONSTANT(int_type, ticks_per_day = INT64_C(86400) * config::tick_per_second);
|
||||
public:
|
||||
# if BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0X581) )
|
||||
# if BOOST_WORKAROUND( BOOST_BORLANDC, BOOST_TESTED_AT(0X581) )
|
||||
typedef date_time::wrapping_int< split_timedate_system::int_type, split_timedate_system::ticks_per_day> wrap_int_type;
|
||||
# else
|
||||
typedef date_time::wrapping_int<int_type, ticks_per_day> wrap_int_type;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static time_rep_type get_time_rep(special_values sv)
|
||||
static
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
time_rep_type get_time_rep(special_values sv)
|
||||
{
|
||||
switch (sv) {
|
||||
case not_a_date_time:
|
||||
return time_rep_type(date_type(not_a_date_time),
|
||||
time_duration_type(not_a_date_time));
|
||||
case pos_infin:
|
||||
return time_rep_type(date_type(pos_infin),
|
||||
return time_rep_type(date_type(pos_infin),
|
||||
time_duration_type(pos_infin));
|
||||
case neg_infin:
|
||||
return time_rep_type(date_type(neg_infin),
|
||||
return time_rep_type(date_type(neg_infin),
|
||||
time_duration_type(neg_infin));
|
||||
case max_date_time: {
|
||||
time_duration_type td = time_duration_type(24,0,0,0) - time_duration_type(0,0,0,1);
|
||||
@@ -69,14 +74,16 @@ namespace date_time {
|
||||
default:
|
||||
return time_rep_type(date_type(not_a_date_time),
|
||||
time_duration_type(not_a_date_time));
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static time_rep_type get_time_rep(const date_type& day,
|
||||
const time_duration_type& tod,
|
||||
date_time::dst_flags /* dst */ = not_dst)
|
||||
static
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
time_rep_type get_time_rep(const date_type& day,
|
||||
const time_duration_type& tod,
|
||||
date_time::dst_flags /* dst */ = not_dst)
|
||||
{
|
||||
if(day.is_special() || tod.is_special()) {
|
||||
if(day.is_not_a_date() || tod.is_not_a_date_time()) {
|
||||
@@ -122,11 +129,11 @@ namespace date_time {
|
||||
}
|
||||
return time_rep_type(day, tod);
|
||||
}
|
||||
static date_type get_date(const time_rep_type& val)
|
||||
static BOOST_CONSTEXPR date_type get_date(const time_rep_type& val)
|
||||
{
|
||||
return date_type(val.day);
|
||||
}
|
||||
static time_duration_type get_time_of_day(const time_rep_type& val)
|
||||
static BOOST_CONSTEXPR time_duration_type get_time_of_day(const time_rep_type& val)
|
||||
{
|
||||
return time_duration_type(val.time_of_day);
|
||||
}
|
||||
@@ -134,28 +141,33 @@ namespace date_time {
|
||||
{
|
||||
return std::string();
|
||||
}
|
||||
static bool is_equal(const time_rep_type& lhs, const time_rep_type& rhs)
|
||||
static BOOST_CONSTEXPR
|
||||
bool is_equal(const time_rep_type& lhs, const time_rep_type& rhs)
|
||||
{
|
||||
return ((lhs.day == rhs.day) && (lhs.time_of_day == rhs.time_of_day));
|
||||
}
|
||||
static bool is_less(const time_rep_type& lhs, const time_rep_type& rhs)
|
||||
static BOOST_CXX14_CONSTEXPR
|
||||
bool is_less(const time_rep_type& lhs, const time_rep_type& rhs)
|
||||
{
|
||||
if (lhs.day < rhs.day) return true;
|
||||
if (lhs.day > rhs.day) return false;
|
||||
return (lhs.time_of_day < rhs.time_of_day);
|
||||
}
|
||||
static time_rep_type add_days(const time_rep_type& base,
|
||||
const date_duration_type& dd)
|
||||
static BOOST_CXX14_CONSTEXPR
|
||||
time_rep_type add_days(const time_rep_type& base,
|
||||
const date_duration_type& dd)
|
||||
{
|
||||
return time_rep_type(base.day+dd, base.time_of_day);
|
||||
}
|
||||
static time_rep_type subtract_days(const time_rep_type& base,
|
||||
const date_duration_type& dd)
|
||||
static BOOST_CXX14_CONSTEXPR
|
||||
time_rep_type subtract_days(const time_rep_type& base,
|
||||
const date_duration_type& dd)
|
||||
{
|
||||
return split_timedate_system::get_time_rep(base.day-dd, base.time_of_day);
|
||||
}
|
||||
static time_rep_type subtract_time_duration(const time_rep_type& base,
|
||||
const time_duration_type& td)
|
||||
static BOOST_CXX14_CONSTEXPR
|
||||
time_rep_type subtract_time_duration(const time_rep_type& base,
|
||||
const time_duration_type& td)
|
||||
{
|
||||
if(base.day.is_special() || td.is_special())
|
||||
{
|
||||
@@ -172,8 +184,9 @@ namespace date_time {
|
||||
return time_rep_type(base.day-day_overflow,
|
||||
time_duration_type(0,0,0,day_offset.as_int()));
|
||||
}
|
||||
static time_rep_type add_time_duration(const time_rep_type& base,
|
||||
time_duration_type td)
|
||||
static BOOST_CXX14_CONSTEXPR
|
||||
time_rep_type add_time_duration(const time_rep_type& base,
|
||||
time_duration_type td)
|
||||
{
|
||||
if(base.day.is_special() || td.is_special()) {
|
||||
return split_timedate_system::get_time_rep(base.day, td);
|
||||
@@ -183,22 +196,28 @@ namespace date_time {
|
||||
return subtract_time_duration(base,td1);
|
||||
}
|
||||
|
||||
wrap_int_type day_offset(base.time_of_day.ticks());
|
||||
wrap_int_type day_offset(base.time_of_day.ticks());
|
||||
date_duration_type day_overflow(static_cast< typename date_duration_type::duration_rep_type >(day_offset.add(td.ticks())));
|
||||
|
||||
return time_rep_type(base.day+day_overflow,
|
||||
time_duration_type(0,0,0,day_offset.as_int()));
|
||||
}
|
||||
static time_duration_type subtract_times(const time_rep_type& lhs,
|
||||
const time_rep_type& rhs)
|
||||
static BOOST_CXX14_CONSTEXPR
|
||||
time_duration_type subtract_times(const time_rep_type& lhs,
|
||||
const time_rep_type& rhs)
|
||||
{
|
||||
date_duration_type dd = lhs.day - rhs.day;
|
||||
time_duration_type td(dd.days()*24,0,0); //days * 24 hours
|
||||
time_duration_type td2 = lhs.time_of_day - rhs.time_of_day;
|
||||
return td+td2;
|
||||
// return time_rep_type(base.day-dd, base.time_of_day);
|
||||
if (BOOST_LIKELY(!dd.is_special())) {
|
||||
time_duration_type td(dd.days()*24,0,0); // days * 24 hours
|
||||
time_duration_type td2 = lhs.time_of_day - rhs.time_of_day;
|
||||
return td+td2;
|
||||
} else {
|
||||
time_duration_type td(dd.as_special());
|
||||
time_duration_type td2 = lhs.time_of_day - rhs.time_of_day;
|
||||
return td+td2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
} } //namespace date_time
|
||||
|
||||
@@ -70,7 +70,7 @@ namespace date_time {
|
||||
|
||||
//! Structure which holds the time offsets associated with daylight savings time
|
||||
/*!
|
||||
*@param time_duration_type A type used to represent the offset
|
||||
*@tparam time_duration_type A type used to represent the offset
|
||||
*/
|
||||
template<class time_duration_type>
|
||||
class dst_adjustment_offsets
|
||||
|
||||
@@ -43,7 +43,7 @@ namespace date_time {
|
||||
* name: Pacific Standard Time and the abbreviated name: PST.
|
||||
* During daylight savings there are additional names:
|
||||
* Pacific Daylight Time and PDT.
|
||||
*@parm CharT Allows class to support different character types
|
||||
*@tparam CharT Allows class to support different character types
|
||||
*/
|
||||
template<class CharT>
|
||||
class time_zone_names_base
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <boost/date_time/time_zone_names.hpp>
|
||||
#include <boost/date_time/time_zone_base.hpp>
|
||||
#include <boost/date_time/time_parsing.hpp>
|
||||
#include <boost/algorithm/string.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace date_time {
|
||||
@@ -170,8 +171,9 @@ namespace boost {
|
||||
/*! May throw bad_field_count exceptions */
|
||||
void load_from_stream(std::istream &in)
|
||||
{
|
||||
std::string buff;
|
||||
std::string buff;
|
||||
while( std::getline(in, buff)) {
|
||||
boost::trim_right(buff);
|
||||
parse_string(buff);
|
||||
}
|
||||
}
|
||||
@@ -243,7 +245,6 @@ namespace boost {
|
||||
//! parses rule specs for transition day rules
|
||||
rule_type* parse_rules(const string_type& sr, const string_type& er) const
|
||||
{
|
||||
using namespace gregorian;
|
||||
// start and end rule are of the same type,
|
||||
// both are included here for readability
|
||||
typedef typename rule_type::start_rule start_rule;
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include "boost/config.hpp"
|
||||
|
||||
namespace boost {
|
||||
namespace date_time {
|
||||
@@ -32,19 +33,19 @@ class wrapping_int {
|
||||
public:
|
||||
typedef int_type_ int_type;
|
||||
//typedef overflow_type_ overflow_type;
|
||||
static int_type wrap_value() {return wrap_val;}
|
||||
static BOOST_CONSTEXPR int_type wrap_value() {return wrap_val;}
|
||||
//!Add, return true if wrapped
|
||||
wrapping_int(int_type v) : value_(v) {}
|
||||
BOOST_CXX14_CONSTEXPR wrapping_int(int_type v) : value_(v) {}
|
||||
//! Explicit converion method
|
||||
int_type as_int() const {return value_;}
|
||||
operator int_type() const {return value_;}
|
||||
BOOST_CONSTEXPR int_type as_int() const {return value_;}
|
||||
BOOST_CONSTEXPR operator int_type() const {return value_;}
|
||||
//!Add, return number of wraps performed
|
||||
/*! The sign of the returned value will indicate which direction the
|
||||
* wraps went. Ex: add a negative number and wrapping under could occur,
|
||||
* this would be indicated by a negative return value. If wrapping over
|
||||
* took place, a positive value would be returned */
|
||||
template< typename IntT >
|
||||
IntT add(IntT v)
|
||||
BOOST_CXX14_CONSTEXPR IntT add(IntT v)
|
||||
{
|
||||
int_type remainder = static_cast<int_type>(v % (wrap_val));
|
||||
IntT overflow = static_cast<IntT>(v / (wrap_val));
|
||||
@@ -58,7 +59,7 @@ public:
|
||||
* occur, this would be indicated by a negative return value. If
|
||||
* wrapping under took place, a positive value would be returned. */
|
||||
template< typename IntT >
|
||||
IntT subtract(IntT v)
|
||||
BOOST_CXX14_CONSTEXPR IntT subtract(IntT v)
|
||||
{
|
||||
int_type remainder = static_cast<int_type>(v % (wrap_val));
|
||||
IntT underflow = static_cast<IntT>(-(v / (wrap_val)));
|
||||
@@ -69,7 +70,7 @@ private:
|
||||
int_type value_;
|
||||
|
||||
template< typename IntT >
|
||||
IntT calculate_wrap(IntT wrap)
|
||||
BOOST_CXX14_CONSTEXPR IntT calculate_wrap(IntT wrap)
|
||||
{
|
||||
if ((value_) >= wrap_val)
|
||||
{
|
||||
@@ -95,11 +96,11 @@ template<typename int_type_, int_type_ wrap_min, int_type_ wrap_max>
|
||||
class wrapping_int2 {
|
||||
public:
|
||||
typedef int_type_ int_type;
|
||||
static int_type wrap_value() {return wrap_max;}
|
||||
static int_type min_value() {return wrap_min;}
|
||||
static BOOST_CONSTEXPR int_type wrap_value() {return wrap_max;}
|
||||
static BOOST_CONSTEXPR int_type min_value() {return wrap_min;}
|
||||
/*! If initializing value is out of range of [wrap_min, wrap_max],
|
||||
* value will be initialized to closest of min or max */
|
||||
wrapping_int2(int_type v) : value_(v) {
|
||||
BOOST_CXX14_CONSTEXPR wrapping_int2(int_type v) : value_(v) {
|
||||
if(value_ < wrap_min)
|
||||
{
|
||||
value_ = wrap_min;
|
||||
@@ -110,15 +111,15 @@ public:
|
||||
}
|
||||
}
|
||||
//! Explicit converion method
|
||||
int_type as_int() const {return value_;}
|
||||
operator int_type() const {return value_;}
|
||||
BOOST_CONSTEXPR int_type as_int() const {return value_;}
|
||||
BOOST_CONSTEXPR operator int_type() const {return value_;}
|
||||
//!Add, return number of wraps performed
|
||||
/*! The sign of the returned value will indicate which direction the
|
||||
* wraps went. Ex: add a negative number and wrapping under could occur,
|
||||
* this would be indicated by a negative return value. If wrapping over
|
||||
* took place, a positive value would be returned */
|
||||
template< typename IntT >
|
||||
IntT add(IntT v)
|
||||
BOOST_CXX14_CONSTEXPR IntT add(IntT v)
|
||||
{
|
||||
int_type remainder = static_cast<int_type>(v % (wrap_max - wrap_min + 1));
|
||||
IntT overflow = static_cast<IntT>(v / (wrap_max - wrap_min + 1));
|
||||
@@ -131,7 +132,7 @@ public:
|
||||
* occur, this would be indicated by a positive return value. If
|
||||
* wrapping under took place, a negative value would be returned */
|
||||
template< typename IntT >
|
||||
IntT subtract(IntT v)
|
||||
BOOST_CXX14_CONSTEXPR IntT subtract(IntT v)
|
||||
{
|
||||
int_type remainder = static_cast<int_type>(v % (wrap_max - wrap_min + 1));
|
||||
IntT underflow = static_cast<IntT>(-(v / (wrap_max - wrap_min + 1)));
|
||||
@@ -143,7 +144,7 @@ private:
|
||||
int_type value_;
|
||||
|
||||
template< typename IntT >
|
||||
IntT calculate_wrap(IntT wrap)
|
||||
BOOST_CXX14_CONSTEXPR IntT calculate_wrap(IntT wrap)
|
||||
{
|
||||
if ((value_) > wrap_max)
|
||||
{
|
||||
|
||||
@@ -17,9 +17,11 @@ namespace date_time {
|
||||
//! Allow rapid creation of ymd triples of different types
|
||||
template<typename YearType, typename MonthType, typename DayType>
|
||||
struct BOOST_SYMBOL_VISIBLE year_month_day_base {
|
||||
year_month_day_base(YearType year,
|
||||
BOOST_CXX14_CONSTEXPR
|
||||
year_month_day_base(YearType year,
|
||||
MonthType month,
|
||||
DayType day);
|
||||
|
||||
YearType year;
|
||||
MonthType month;
|
||||
DayType day;
|
||||
@@ -27,11 +29,11 @@ namespace date_time {
|
||||
typedef MonthType month_type;
|
||||
typedef DayType day_type;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
//! A basic constructor
|
||||
template<typename YearType, typename MonthType, typename DayType>
|
||||
inline
|
||||
inline BOOST_CXX14_CONSTEXPR
|
||||
year_month_day_base<YearType,MonthType,DayType>::year_month_day_base(YearType y,
|
||||
MonthType m,
|
||||
DayType d) :
|
||||
@@ -39,7 +41,7 @@ namespace date_time {
|
||||
month(m),
|
||||
day(d)
|
||||
{}
|
||||
|
||||
|
||||
} }//namespace date_time
|
||||
|
||||
|
||||
|
||||
+4
-2
@@ -10,6 +10,8 @@
|
||||
"System"
|
||||
],
|
||||
"maintainers": [
|
||||
"Jeff Garland <jeff -at- crystalclearsoftware.com>"
|
||||
]
|
||||
"Jeff Garland <jeff -at- crystalclearsoftware.com>",
|
||||
"James E. King III <jking -at- apache.org>"
|
||||
],
|
||||
"cxxstd": "11"
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright (c) 2002-2005 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)
|
||||
@@ -7,164 +7,22 @@
|
||||
*/
|
||||
|
||||
|
||||
|
||||
// define BOOST_DATE_TIME_SOURCE so that <boost/date_time/config.hpp> knows
|
||||
// the library is being built (possibly exporting rather than importing code)
|
||||
#ifndef BOOST_DATE_TIME_SOURCE
|
||||
#define BOOST_DATE_TIME_SOURCE
|
||||
#endif
|
||||
#include "boost/date_time/gregorian/greg_month.hpp"
|
||||
#include "boost/date_time/gregorian/greg_facet.hpp"
|
||||
#include "boost/date_time/date_format_simple.hpp"
|
||||
#include "boost/date_time/compiler_config.hpp"
|
||||
#if defined(BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS)
|
||||
#include "boost/date_time/gregorian/formatters_limited.hpp"
|
||||
#else
|
||||
#include "boost/date_time/gregorian/formatters.hpp"
|
||||
#endif
|
||||
#include "boost/date_time/date_parsing.hpp"
|
||||
#include "boost/date_time/gregorian/parsers.hpp"
|
||||
|
||||
#include "greg_names.hpp"
|
||||
#include <boost/date_time/compiler_config.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace gregorian {
|
||||
|
||||
/*! Returns a shared pointer to a map of Month strings & numbers.
|
||||
* Strings are both full names and abbreviations.
|
||||
* Ex. ("jan",1), ("february",2), etc...
|
||||
* Note: All characters are lowercase - for case insensitivity
|
||||
*/
|
||||
greg_month::month_map_ptr_type greg_month::get_month_map_ptr()
|
||||
{
|
||||
static month_map_ptr_type month_map_ptr(new greg_month::month_map_type());
|
||||
|
||||
if(month_map_ptr->empty()) {
|
||||
std::string s("");
|
||||
for(unsigned short i = 1; i <= 12; ++i) {
|
||||
greg_month m(static_cast<month_enum>(i));
|
||||
s = m.as_long_string();
|
||||
s = date_time::convert_to_lower(s);
|
||||
month_map_ptr->insert(std::make_pair(s, i));
|
||||
s = m.as_short_string();
|
||||
s = date_time::convert_to_lower(s);
|
||||
month_map_ptr->insert(std::make_pair(s, i));
|
||||
}
|
||||
}
|
||||
return month_map_ptr;
|
||||
}
|
||||
BOOST_DATE_TIME_DECL void date_time_dummy_exported_function()
|
||||
{}
|
||||
|
||||
|
||||
//! Returns 3 char english string for the month ex: Jan, Feb, Mar, Apr
|
||||
const char*
|
||||
greg_month::as_short_string() const
|
||||
{
|
||||
return short_month_names[value_-1];
|
||||
}
|
||||
|
||||
//! Returns full name of month as string in english ex: January, February
|
||||
const char*
|
||||
greg_month::as_long_string() const
|
||||
{
|
||||
return long_month_names[value_-1];
|
||||
}
|
||||
|
||||
//! Return special_value from string argument
|
||||
/*! Return special_value from string argument. If argument is
|
||||
* not one of the special value names (defined in names.hpp),
|
||||
* return 'not_special' */
|
||||
special_values special_value_from_string(const std::string& s) {
|
||||
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 not_special;
|
||||
}
|
||||
else {
|
||||
return static_cast<special_values>(i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifndef BOOST_NO_STD_WSTRING
|
||||
//! Returns 3 wchar_t english string for the month ex: Jan, Feb, Mar, Apr
|
||||
const wchar_t*
|
||||
greg_month::as_short_wstring() const
|
||||
{
|
||||
return w_short_month_names[value_-1];
|
||||
}
|
||||
|
||||
//! Returns full name of month as wchar_t string in english ex: January, February
|
||||
const wchar_t*
|
||||
greg_month::as_long_wstring() const
|
||||
{
|
||||
return w_long_month_names[value_-1];
|
||||
}
|
||||
#endif // BOOST_NO_STD_WSTRING
|
||||
|
||||
#ifndef BOOST_DATE_TIME_NO_LOCALE
|
||||
/*! creates an all_date_names_put object with the correct set of names.
|
||||
* This function is only called in the event of an exception where
|
||||
* the imbued locale containing the needed facet is for some reason
|
||||
* unreachable.
|
||||
*/
|
||||
BOOST_DATE_TIME_DECL
|
||||
boost::date_time::all_date_names_put<greg_facet_config, char>*
|
||||
create_facet_def(char /*type*/)
|
||||
{
|
||||
typedef
|
||||
boost::date_time::all_date_names_put<greg_facet_config, char> facet_def;
|
||||
|
||||
return new facet_def(short_month_names,
|
||||
long_month_names,
|
||||
special_value_names,
|
||||
short_weekday_names,
|
||||
long_weekday_names);
|
||||
}
|
||||
|
||||
//! generates a locale with the set of gregorian name-strings of type char*
|
||||
BOOST_DATE_TIME_DECL std::locale generate_locale(std::locale& loc, char /*type*/){
|
||||
typedef boost::date_time::all_date_names_put<greg_facet_config, char> facet_def;
|
||||
return std::locale(loc, new facet_def(short_month_names,
|
||||
long_month_names,
|
||||
special_value_names,
|
||||
short_weekday_names,
|
||||
long_weekday_names)
|
||||
);
|
||||
}
|
||||
|
||||
#ifndef BOOST_NO_STD_WSTRING
|
||||
/*! creates an all_date_names_put object with the correct set of names.
|
||||
* This function is only called in the event of an exception where
|
||||
* the imbued locale containing the needed facet is for some reason
|
||||
* unreachable.
|
||||
*/
|
||||
BOOST_DATE_TIME_DECL
|
||||
boost::date_time::all_date_names_put<greg_facet_config, wchar_t>*
|
||||
create_facet_def(wchar_t /*type*/)
|
||||
{
|
||||
typedef
|
||||
boost::date_time::all_date_names_put<greg_facet_config,wchar_t> facet_def;
|
||||
|
||||
return new facet_def(w_short_month_names,
|
||||
w_long_month_names,
|
||||
w_special_value_names,
|
||||
w_short_weekday_names,
|
||||
w_long_weekday_names);
|
||||
}
|
||||
|
||||
//! generates a locale with the set of gregorian name-strings of type wchar_t*
|
||||
BOOST_DATE_TIME_DECL std::locale generate_locale(std::locale& loc, wchar_t /*type*/){
|
||||
typedef boost::date_time::all_date_names_put<greg_facet_config, wchar_t> facet_def;
|
||||
return std::locale(loc, new facet_def(w_short_month_names,
|
||||
w_long_month_names,
|
||||
w_special_value_names,
|
||||
w_short_weekday_names,
|
||||
w_long_weekday_names)
|
||||
);
|
||||
}
|
||||
#endif // BOOST_NO_STD_WSTRING
|
||||
#endif // BOOST_DATE_TIME_NO_LOCALE
|
||||
|
||||
} } //namespace gregorian
|
||||
} } //namespace boost::gregorian
|
||||
|
||||
|
||||
|
||||
|
||||
+150
-216
@@ -1,233 +1,167 @@
|
||||
import os ;
|
||||
import path ;
|
||||
import regex ;
|
||||
import testing ;
|
||||
|
||||
project : requirements <library>/boost/date_time//boost_date_time ;
|
||||
|
||||
local DATE_TIME_DYNAMIC_PROPERTIES = <define>BOOST_ALL_DYN_LINK <runtime-link>shared <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG <define>BOOST_ALL_NO_LIB ;
|
||||
local DATE_TIME_PROPERTIES = <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG <define>BOOST_DATE_TIME_STATIC_LINK
|
||||
# FIXME
|
||||
#std::locale-support
|
||||
local DATE_TIME_PROPERTIES = <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
# FIXME
|
||||
#std::locale-support
|
||||
<define>BOOST_ALL_NO_LIB ;
|
||||
|
||||
# core stuff
|
||||
run testint_adapter.cpp ;
|
||||
run testtime_resolution_traits.cpp ;
|
||||
run testwrapping_int.cpp ;
|
||||
run testconstrained_value.cpp ;
|
||||
run testgregorian_calendar.cpp ;
|
||||
run testgeneric_period.cpp ;
|
||||
# the library dependence below is just to test that the
|
||||
# stub library will build, it's completely uneeded not that
|
||||
# date-time is all inline
|
||||
run testmisc.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
: testmisc_std_cfg ;
|
||||
|
||||
test-suite date_time_core
|
||||
:
|
||||
[ run testint_adapter.cpp ]
|
||||
[ run testtime_resolution_traits.cpp ]
|
||||
[ run testwrapping_int.cpp ]
|
||||
[ run testconstrained_value.cpp ]
|
||||
[ run testgregorian_calendar.cpp ]
|
||||
[ run testgeneric_period.cpp ]
|
||||
;
|
||||
### gregorian
|
||||
|
||||
test-suite date_time_gregorian
|
||||
:
|
||||
[ run gregorian/testdate.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run gregorian/testdate_duration.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run gregorian/testgreg_durations.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run gregorian/testperiod.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run gregorian/testdate_iterator.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run gregorian/testformatters.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
|
||||
### streaming
|
||||
[ run gregorian/testdate_facet_new.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run gregorian/testdate_input_facet.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
|
||||
###
|
||||
[ run gregorian/testgenerators.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run gregorian/testgreg_cal.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run gregorian/testgreg_day.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run gregorian/testgreg_month.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run gregorian/testgreg_year.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) ]
|
||||
;
|
||||
test-suite date_time_gregorian_dll
|
||||
:
|
||||
[ run gregorian/testdate.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testdate_dll ]
|
||||
[ run gregorian/testdate_duration.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testdate_duration_dll ]
|
||||
[ run gregorian/testperiod.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testperiod_dll ]
|
||||
[ run gregorian/testdate_iterator.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testdate_iterator_dll ]
|
||||
[ run gregorian/testformatters.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testformatters_dll ]
|
||||
### streaming
|
||||
[ run gregorian/testdate_facet_new.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testdate_facet_new_dll ]
|
||||
[ run gregorian/testdate_input_facet.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testdate_input_facet_dll ]
|
||||
###
|
||||
[ run gregorian/testgenerators.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testgenerators_dll ]
|
||||
[ run gregorian/testgreg_cal.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testgreg_cal_dll ]
|
||||
[ run gregorian/testgreg_day.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testgreg_day_dll ]
|
||||
[ run gregorian/testgreg_month.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testgreg_month_dll ]
|
||||
[ run gregorian/testgreg_year.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testgreg_year_dll ]
|
||||
[ run gregorian/testgreg_durations.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) : testgreg_durations_dll ]
|
||||
;
|
||||
run gregorian/testdate.cpp ;
|
||||
run gregorian/testdate_duration.cpp ;
|
||||
run gregorian/testdate_facet_new.cpp ;
|
||||
run gregorian/testdate_input_facet.cpp ;
|
||||
run gregorian/testdate_iterator.cpp ;
|
||||
|
||||
test-suite date_time_posixtime
|
||||
:
|
||||
[ run posix_time/testfiletime_functions.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run posix_time/testlocal_adjustor.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run posix_time/testc_local_adjustor.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run posix_time/testclock.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run posix_time/testdst_rules.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run posix_time/testduration.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run posix_time/testiterator.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run posix_time/testparse_time.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run posix_time/testtime_period.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run posix_time/testtime.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run posix_time/testmicrosec_time_clock.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run posix_time/testtime_formatters.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run posix_time/testgreg_duration_operators.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
### streaming
|
||||
[ run posix_time/testtime_facet.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run posix_time/testtime_input_facet.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
###
|
||||
run gregorian/testgenerators.cpp ;
|
||||
run gregorian/testgreg_cal.cpp ;
|
||||
run gregorian/testgreg_day.cpp ;
|
||||
run gregorian/testgreg_durations.cpp ;
|
||||
run gregorian/testgreg_month.cpp ;
|
||||
run gregorian/testgreg_year.cpp ;
|
||||
run gregorian/testformatters.cpp ;
|
||||
run gregorian/testparse_date.cpp ;
|
||||
run gregorian/testperiod.cpp ;
|
||||
|
||||
;
|
||||
run gregorian/testgreg_serialize.cpp
|
||||
/boost/serialization//boost_serialization
|
||||
: : : <define>DATE_TIME_XML_SERIALIZE
|
||||
: testgreg_serialize_xml ;
|
||||
|
||||
run gregorian/testgreg_serialize.cpp
|
||||
/boost/serialization//boost_serialization
|
||||
: : :
|
||||
: testgreg_serialize ;
|
||||
|
||||
run posix_time/testfiletime_functions.cpp ;
|
||||
run posix_time/testlocal_adjustor.cpp ;
|
||||
run posix_time/testc_local_adjustor.cpp ;
|
||||
run posix_time/testclock.cpp ;
|
||||
run posix_time/testdst_rules.cpp ;
|
||||
run posix_time/testduration.cpp ;
|
||||
run posix_time/testiterator.cpp ;
|
||||
run posix_time/testparse_time.cpp ;
|
||||
run posix_time/testtime_period.cpp ;
|
||||
run posix_time/testtime.cpp ;
|
||||
run posix_time/testmicrosec_time_clock.cpp ;
|
||||
run posix_time/testgreg_duration_operators.cpp ;
|
||||
run posix_time/testtime_facet.cpp ;
|
||||
run posix_time/testtime_input_facet.cpp
|
||||
: : : <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
: testtime_input_facet ;
|
||||
|
||||
run posix_time/testtime_formatters.cpp
|
||||
: : : <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
: testtime_formatters ;
|
||||
|
||||
# text archive tests
|
||||
run posix_time/testtime_serialize.cpp
|
||||
/boost/serialization//boost_serialization
|
||||
: : :
|
||||
: testtime_serialize ;
|
||||
|
||||
run posix_time/testtime_serialize.cpp
|
||||
/boost/serialization//boost_serialization
|
||||
: : : <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
: testtime_serialize_std_config ;
|
||||
|
||||
# xml archive tests
|
||||
run posix_time/testtime_serialize.cpp
|
||||
/boost/serialization//boost_serialization
|
||||
: : : <define>DATE_TIME_XML_SERIALIZE <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
: testtime_serialize_xml_std_config ;
|
||||
|
||||
run posix_time/testtime_serialize.cpp
|
||||
/boost/serialization//boost_serialization
|
||||
: : : <define>DATE_TIME_XML_SERIALIZE
|
||||
: testtime_serialize_xml ;
|
||||
|
||||
# versioning tests
|
||||
run posix_time/testtime_serialize_versioning.cpp
|
||||
/boost/serialization//boost_serialization
|
||||
: : testtime_serialize_versioning_prev
|
||||
: <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
: testtime_serialize_versioning_curr ;
|
||||
|
||||
run posix_time/testtime_serialize_versioning.cpp
|
||||
/boost/serialization//boost_serialization
|
||||
: : : <define>BOOST_DATE_TIME_POSIX_TIME_DURATION_VERSION=0
|
||||
: testtime_serialize_versioning_prev ;
|
||||
|
||||
|
||||
test-suite date_time_wide_streaming
|
||||
:
|
||||
[ run gregorian/testgreg_wstream.cpp
|
||||
../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) <define>USE_DATE_TIME_PRE_1_33_FACET_IO : testgreg_wstream ]
|
||||
[ run posix_time/testtime_wstream.cpp
|
||||
../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) <define>USE_DATE_TIME_PRE_1_33_FACET_IO : testtime_wstream ]
|
||||
;
|
||||
|
||||
test-suite date_time_pre_133_facet
|
||||
:
|
||||
[ run gregorian/testfacet.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) <define>USE_DATE_TIME_PRE_1_33_FACET_IO : testfacet_dll ]
|
||||
# this next test is commented out because it crashes on VC6 (cause unknown):
|
||||
# [ run gregorian/testparse_date.cpp ../build//boost_date_time : : : $(DATE_TIME_DYNAMIC_PROPERTIES) <define>USE_DATE_TIME_PRE_1_33_FACET_IO : testparse_date_dll ]
|
||||
[ run gregorian/testfacet.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) <define>USE_DATE_TIME_PRE_1_33_FACET_IO ]
|
||||
[ run gregorian/testparse_date.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) <define>USE_DATE_TIME_PRE_1_33_FACET_IO ]
|
||||
|
||||
[ run posix_time/teststreams.cpp ../build//boost_date_time/<link>static : : : $(DATE_TIME_PROPERTIES) <define>USE_DATE_TIME_PRE_1_33_FACET_IO ]
|
||||
;
|
||||
|
||||
local DATE_TIME_PROPERTIES = <define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG <define>BOOST_DATE_TIME_STATIC_LINK
|
||||
# FIXME
|
||||
#std::locale-support
|
||||
<define>BOOST_ALL_NO_LIB ;
|
||||
|
||||
test-suite date_time_localtime
|
||||
:
|
||||
[ run local_time/testdst_transition_day_rule.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run local_time/testcustom_time_zone.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run local_time/testposix_time_zone.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run local_time/testwcustom_time_zone.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run local_time/testwposix_time_zone.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run local_time/testtz_database.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run local_time/testlocal_time.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run local_time/testlocal_time_iterator.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run local_time/testlocal_time_period.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
### streaming
|
||||
[ run local_time/testlocal_time_facet.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
[ run local_time/testlocal_time_input_facet.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
###
|
||||
[ run local_time/testclocks.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
: : : $(DATE_TIME_PROPERTIES) ]
|
||||
;
|
||||
|
||||
local DATE_TIME_PROPERTIES = <define>BOOST_DATE_TIME_STATIC_LINK <define>BOOST_ALL_NO_LIB <define>USE_DATE_TIME_PRE_1_33_FACET_IO
|
||||
# FIXME
|
||||
# std::locale-support toolset::require-boost-spirit-support
|
||||
;
|
||||
|
||||
test-suite date_time_serialization
|
||||
:
|
||||
# xml archive tests
|
||||
[ run gregorian/testgreg_serialize.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
../../serialization/build//boost_serialization
|
||||
: : : $(DATE_TIME_PROPERTIES) <define>DATE_TIME_XML_SERIALIZE
|
||||
: testgreg_serialize_xml ]
|
||||
[ run posix_time/testtime_serialize.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
../../serialization/build//boost_serialization
|
||||
: : : $(DATE_TIME_PROPERTIES)
|
||||
<define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
<define>DATE_TIME_XML_SERIALIZE
|
||||
: testtime_serialize_xml_std_config ]
|
||||
[ run posix_time/testtime_serialize.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
../../serialization/build//boost_serialization
|
||||
: : : $(DATE_TIME_PROPERTIES) <define>DATE_TIME_XML_SERIALIZE
|
||||
: testtime_serialize_xml ]
|
||||
|
||||
# text archive tests
|
||||
[ run gregorian/testgreg_serialize.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
../../serialization/build//boost_serialization
|
||||
: : : $(DATE_TIME_PROPERTIES)
|
||||
: testgreg_serialize ]
|
||||
[ run gregorian/testgreg_serialize.cpp
|
||||
../build//boost_date_time
|
||||
../../serialization/build//boost_serialization
|
||||
: : : $(DATE_TIME_DYNAMIC_PROPERTIES)
|
||||
: testgreg_serialize_dll ]
|
||||
[ run posix_time/testtime_serialize.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
../../serialization/build//boost_serialization
|
||||
: : : $(DATE_TIME_PROPERTIES)
|
||||
<define>BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
|
||||
: testtime_serialize_std_config ]
|
||||
[ run posix_time/testtime_serialize.cpp
|
||||
../build//boost_date_time/<link>static
|
||||
../../serialization/build//boost_serialization
|
||||
: : : $(DATE_TIME_PROPERTIES)
|
||||
: testtime_serialize ]
|
||||
;
|
||||
|
||||
|
||||
# Copyright (c) 2000-2005
|
||||
compile-fail posix_time/compile_fail/hours_special_value.cpp ;
|
||||
compile-fail posix_time/compile_fail/minutes_special_value.cpp ;
|
||||
compile-fail posix_time/compile_fail/seconds_special_value.cpp ;
|
||||
compile-fail posix_time/compile_fail/millisec_special_value.cpp ;
|
||||
|
||||
run local_time/testdst_transition_day_rule.cpp ;
|
||||
run local_time/testcustom_time_zone.cpp ;
|
||||
run local_time/testposix_time_zone.cpp ;
|
||||
run local_time/testwcustom_time_zone.cpp ;
|
||||
run local_time/testwposix_time_zone.cpp ;
|
||||
run local_time/testlocal_time.cpp ;
|
||||
run local_time/testlocal_time_iterator.cpp ;
|
||||
run local_time/testlocal_time_period.cpp ;
|
||||
|
||||
run local_time/testtz_database.cpp
|
||||
: : ../data/date_time_zonespec.csv local_time/poorly_formed_zonespec.csv
|
||||
: ;
|
||||
run local_time/testlocal_time_facet.cpp
|
||||
: : ../data/date_time_zonespec.csv : ;
|
||||
run local_time/testclocks.cpp ;
|
||||
|
||||
|
||||
#todo
|
||||
#if ! [ os.environ UBSAN_OPTIONS ]
|
||||
#{
|
||||
# local DATE_TIME_PROPERTIES = <define>BOOST_ALL_NO_LIB <define>USE_DATE_TIME_PRE_1_33_FACET_IO
|
||||
# # FIXME
|
||||
# # std::locale-support toolset::require-boost-spirit-support
|
||||
# ;
|
||||
|
||||
# Iterate over all public headers and generate a self-contained header test to check for any missing includes
|
||||
# and basic syntax errors.
|
||||
if ! [ os.environ BOOST_DATE_TIME_TEST_WITHOUT_SELF_CONTAINED_HEADER_TESTS ]
|
||||
{
|
||||
for file in [ glob-tree-ex ../include/boost : *.hpp ]
|
||||
{
|
||||
local rel_file = [ path.relative-to ../include/boost $(file) ] ;
|
||||
# Note: The test name starts with '~' in order to group these tests in the test report table, preferably at the end.
|
||||
# All '/' are replaced with '-' because apparently test scripts have a problem with test names containing slashes.
|
||||
local test_name = [ regex.replace ~hdr/$(rel_file) "/" "-" ] ;
|
||||
#ECHO $(rel_file) ;
|
||||
compile self_contained_header.cpp : <define>"BOOST_DATE_TIME_TEST_HEADER=$(rel_file)" <dependency>$(file) : $(test_name) ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Copyright (c) 2000-2020
|
||||
# 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)
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
# Copyright 2021-2024 Alexander Grund
|
||||
# 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
|
||||
|
||||
cmake_minimum_required(VERSION 3.5...3.16)
|
||||
|
||||
project(cmake_subdir_test LANGUAGES CXX)
|
||||
|
||||
# Those 2 should work the same
|
||||
# while using find_package for the installed Boost avoids the need to manually specify dependencies
|
||||
if(BOOST_CI_INSTALL_TEST)
|
||||
find_package(boost_date_time REQUIRED)
|
||||
else()
|
||||
set(BOOST_INCLUDE_LIBRARIES date_time)
|
||||
add_subdirectory(../../../.. deps/boost EXCLUDE_FROM_ALL)
|
||||
endif()
|
||||
|
||||
add_executable(main main.cpp)
|
||||
target_link_libraries(main Boost::date_time)
|
||||
|
||||
enable_testing()
|
||||
add_test(NAME main COMMAND main)
|
||||
@@ -0,0 +1,86 @@
|
||||
/* A simple example for using a custom_time_zone and a posix_time_zone.
|
||||
*/
|
||||
|
||||
#include "boost/date_time/local_time/local_time.hpp"
|
||||
#include <iostream>
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
using namespace boost;
|
||||
using namespace local_time;
|
||||
using namespace gregorian;
|
||||
using posix_time::time_duration;
|
||||
|
||||
/***** custom_time_zone *****/
|
||||
|
||||
// create the dependent objects for a custom_time_zone
|
||||
time_zone_names tzn("Eastern Standard Time", "EST",
|
||||
"Eastern Daylight Time", "EDT");
|
||||
time_duration utc_offset(-5,0,0);
|
||||
dst_adjustment_offsets adj_offsets(time_duration(1,0,0),
|
||||
time_duration(2,0,0),
|
||||
time_duration(2,0,0));
|
||||
// rules for this zone are:
|
||||
// start on first Sunday of April at 2 am
|
||||
// end on last Sunday of October at 2 am
|
||||
// so we use a first_last_dst_rule
|
||||
first_day_of_the_week_in_month start_rule(Sunday, Apr);
|
||||
last_day_of_the_week_in_month end_rule(Sunday, Oct);
|
||||
shared_ptr<dst_calc_rule> nyc_rules(new first_last_dst_rule(start_rule,
|
||||
end_rule));
|
||||
// create more dependent objects for a non-dst custom_time_zone
|
||||
time_zone_names tzn2("Mountain Standard Time", "MST",
|
||||
"", ""); // no dst means empty dst strings
|
||||
time_duration utc_offset2(-7,0,0);
|
||||
dst_adjustment_offsets adj_offsets2(time_duration(0,0,0),
|
||||
time_duration(0,0,0),
|
||||
time_duration(0,0,0));
|
||||
// no dst means we need a null pointer to the rules
|
||||
shared_ptr<dst_calc_rule> phx_rules;
|
||||
|
||||
// create the custom_time_zones
|
||||
time_zone_ptr nyc_1(new custom_time_zone(tzn, utc_offset, adj_offsets, nyc_rules));
|
||||
time_zone_ptr phx_1(new custom_time_zone(tzn2, utc_offset2, adj_offsets2, phx_rules));
|
||||
|
||||
/***** posix_time_zone *****/
|
||||
|
||||
// create posix_time_zones that are the duplicates of the
|
||||
// custom_time_zones created above. See posix_time_zone documentation
|
||||
// for details on full zone names.
|
||||
std::string nyc_string, phx_string;
|
||||
nyc_string = "EST-05:00:00EDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00";
|
||||
// nyc_string = "EST-05EDT,M4.1.0,M10.5.0"; // shorter when defaults used
|
||||
phx_string = "MST-07"; // no-dst
|
||||
time_zone_ptr nyc_2(new posix_time_zone(nyc_string));
|
||||
time_zone_ptr phx_2(new posix_time_zone(phx_string));
|
||||
|
||||
|
||||
/***** show the sets are equal *****/
|
||||
|
||||
std::cout << "The first zone is in daylight savings from:\n "
|
||||
<< nyc_1->dst_local_start_time(2004) << " through "
|
||||
<< nyc_1->dst_local_end_time(2004) << std::endl;
|
||||
|
||||
std::cout << "The second zone is in daylight savings from:\n "
|
||||
<< nyc_2->dst_local_start_time(2004) << " through "
|
||||
<< nyc_2->dst_local_end_time(2004) << std::endl;
|
||||
|
||||
std::cout << "The third zone (no daylight savings):\n "
|
||||
<< phx_1->std_zone_abbrev() << " and "
|
||||
<< phx_1->base_utc_offset() << std::endl;
|
||||
|
||||
std::cout << "The fourth zone (no daylight savings):\n "
|
||||
<< phx_2->std_zone_abbrev() << " and "
|
||||
<< phx_2->base_utc_offset() << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Copyright 2001-2005: CrystalClear Software, Inc
|
||||
* http://www.crystalclearsoftware.com
|
||||
*
|
||||
* 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)
|
||||
*/
|
||||
|
||||
@@ -5,10 +5,23 @@
|
||||
* Author: Jeff Garland, Bart Garst
|
||||
*/
|
||||
|
||||
#include <iostream>
|
||||
#include <boost/cstdint.hpp>
|
||||
#include "boost/date_time/gregorian/gregorian.hpp"
|
||||
#include "../testfrmwk.hpp"
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
|
||||
void test_yearlimit(int yr, bool allowed)
|
||||
{
|
||||
std::stringstream sdesc;
|
||||
sdesc << "should" << (allowed ? "" : " not") << " be able to make a date in year " << yr;
|
||||
|
||||
try {
|
||||
boost::gregorian::date chkyr(yr, 1, 1);
|
||||
check(sdesc.str(), allowed);
|
||||
}
|
||||
catch (std::out_of_range&) { check(sdesc.str(), !allowed); }
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
@@ -21,9 +34,28 @@ main()
|
||||
date def;
|
||||
check("Default constructor", def == date(not_a_date_time));
|
||||
#endif
|
||||
date d(2000,1,1);
|
||||
|
||||
#ifdef BOOST_NO_CXX14_CONSTEXPR
|
||||
check("constexpr not configured", true);
|
||||
#else
|
||||
//check constexpr case
|
||||
{
|
||||
constexpr date d1(1900,1,1);
|
||||
static_assert(d1.day() == 1, "constexpr construction day()");
|
||||
static_assert(d1.month() == 1, "constexpr construction month()");
|
||||
static_assert(d1.year() == 1900, "constexpr construction year()");
|
||||
constexpr date d2 = date(2000,12,31);
|
||||
constexpr date d3(d2);
|
||||
static_assert(d3.day() == 31, "constexpr construct and copy day()");
|
||||
static_assert(d3.month() == 12, "constexpr construct and copy month()");
|
||||
static_assert(d3.year() == 2000, "constexpr construct and copy year()");
|
||||
check("constexpr tests compiled", true);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
date d1(1900,1,1);
|
||||
date d2 = d;
|
||||
date d2 = date(2000,1,1);
|
||||
date d3(d2);
|
||||
check("Copy constructor", d3 == d2);
|
||||
date d4(2000,12,31);
|
||||
@@ -276,7 +308,7 @@ main()
|
||||
}
|
||||
|
||||
//converts to date and back -- should get same result
|
||||
check_equal("tm conversion functions 2000-1-1", date_from_tm(to_tm(d)), d);
|
||||
check_equal("tm conversion functions 2000-1-1", date_from_tm(to_tm(d2)), d2);
|
||||
check_equal("tm conversion functions 1900-1-1", date_from_tm(to_tm(d1)), d1);
|
||||
check_equal("tm conversion functions min date 1400-1-1 ", date_from_tm(to_tm(d14)), d14);
|
||||
check_equal("tm conversion functions max date 9999-12-31", date_from_tm(to_tm(d13)), d13);
|
||||
@@ -286,13 +318,21 @@ main()
|
||||
tm d_tm = to_tm(d);
|
||||
check("Exception not thrown (special_value to_tm)", false);
|
||||
std::cout << d_tm.tm_sec << std::endl; //does nothing useful but stops compiler from complaining about unused d_tm
|
||||
}catch(std::out_of_range& e){
|
||||
}catch(std::out_of_range&){
|
||||
check("Caught expected exception (special_value to_tm)", true);
|
||||
}catch(...){
|
||||
check("Caught un-expected exception (special_value to_tm)", false);
|
||||
}
|
||||
|
||||
return printTestStats();
|
||||
// trac-13159
|
||||
test_yearlimit( 0, false);
|
||||
test_yearlimit( 1399, false);
|
||||
test_yearlimit( 1400, true);
|
||||
test_yearlimit( 1401, true);
|
||||
test_yearlimit( 9999, true);
|
||||
test_yearlimit(10000, false);
|
||||
test_yearlimit(10001, false);
|
||||
|
||||
return printTestStats();
|
||||
}
|
||||
|
||||
|
||||
@@ -176,6 +176,18 @@ int main() {
|
||||
std::locale(std::locale::classic(), datefacet));
|
||||
}
|
||||
|
||||
// trac-11142: actually test delimiter_strings(...)
|
||||
{
|
||||
date_facet* datefacet = new date_facet();
|
||||
datefacet->set_iso_extended_format();
|
||||
period_formatter pf(period_formatter::AS_OPEN_RANGE, " / ", "[ ", " )", " ]");
|
||||
pf.delimiter_strings(" to ", "from ", " inclusive", " exclusive");
|
||||
datefacet->period_formatter(pf);
|
||||
teststreaming("custom date facet date period - delimiter_strings", dp,
|
||||
std::string("from 2004-10-13 to 2004-10-20 inclusive"),
|
||||
std::locale(std::locale::classic(), datefacet));
|
||||
}
|
||||
|
||||
{
|
||||
date_facet* datefacet = new date_facet("%A %b %d, %Y");
|
||||
datefacet->short_month_names(short_month_names);
|
||||
@@ -346,12 +358,12 @@ int main() {
|
||||
|
||||
// greg_month tests
|
||||
{
|
||||
for(int i = 0; i < 12; ++i) {
|
||||
for(greg_month::value_type i = 0; i < 12; ++i) {
|
||||
greg_month m(i+1); // month numbers 1-12
|
||||
teststreaming("greg_month short", m, short_months[i], loc);
|
||||
}
|
||||
small_types_facet->month_format(L"%B"); // full name
|
||||
for(int i = 0; i < 12; ++i) {
|
||||
for(greg_month::value_type i = 0; i < 12; ++i) {
|
||||
greg_month m(i+1); // month numbers 1-12
|
||||
teststreaming("greg_month full", m, full_months[i], loc);
|
||||
}
|
||||
@@ -359,12 +371,12 @@ int main() {
|
||||
|
||||
// greg_weekday tests
|
||||
{
|
||||
for(int i = 0; i < 7; ++i) {
|
||||
for(greg_weekday::value_type i = 0; i < 7; ++i) {
|
||||
greg_weekday gw(i); // weekday numbers 0-6
|
||||
teststreaming("greg_weekday short", gw, short_weekdays[i], loc);
|
||||
}
|
||||
small_types_facet->weekday_format(L"%A"); // full name
|
||||
for(int i = 0; i < 7; ++i) {
|
||||
for(greg_weekday::value_type i = 0; i < 7; ++i) {
|
||||
greg_weekday gw(i); // weekday numbers 0-6
|
||||
teststreaming("greg_weekday full", gw, full_weekdays[i], loc);
|
||||
}
|
||||
|
||||
@@ -77,8 +77,8 @@ int main(){
|
||||
std::stringstream ss("Mar.");
|
||||
std::istreambuf_iterator<char> sitr(ss), str_end;
|
||||
|
||||
date_input_facet* f = new date_input_facet();
|
||||
f->get(sitr, str_end, ss, m);
|
||||
date_input_facet f;
|
||||
f.get(sitr, str_end, ss, m);
|
||||
check("No extra characters consumed", m == greg_month(Mar) && *sitr == '.');
|
||||
}
|
||||
|
||||
@@ -170,39 +170,39 @@ int main(){
|
||||
failure_test(d,"2005071", e_bad_day_of_month, f2));
|
||||
|
||||
{ // literal % in format tests
|
||||
date d(not_a_date_time);
|
||||
greg_month m(1);
|
||||
greg_weekday gw(0);
|
||||
date dx(not_a_date_time);
|
||||
greg_month mx(1);
|
||||
greg_weekday gwx(0);
|
||||
greg_year y(1400);
|
||||
date_input_facet* f = new date_input_facet("%%d %Y-%b-%d");
|
||||
std::stringstream ss;
|
||||
ss.imbue(std::locale(ss.getloc(), f));
|
||||
|
||||
ss.str("%d 2005-Jun-14");
|
||||
ss >> d;
|
||||
check_equal("Literal '%' in date format", d, date(2005,Jun,14));
|
||||
ss >> dx;
|
||||
check_equal("Literal '%' in date format", dx, date(2005,Jun,14));
|
||||
f->format("%%%d %Y-%b-%d");
|
||||
ss.str("%14 2005-Jun-14");
|
||||
ss >> d;
|
||||
check_equal("Multiple literal '%'s in date format", d, date(2005,Jun,14));
|
||||
ss >> dx;
|
||||
check_equal("Multiple literal '%'s in date format", dx, date(2005,Jun,14));
|
||||
|
||||
f->month_format("%%b %b");
|
||||
ss.str("%b Jun");
|
||||
ss >> m;
|
||||
check_equal("Literal '%' in month format", m, greg_month(6));
|
||||
ss >> mx;
|
||||
check_equal("Literal '%' in month format", mx, greg_month(6));
|
||||
f->month_format("%%%b");
|
||||
ss.str("%Jun");
|
||||
ss >> m;
|
||||
check_equal("Multiple literal '%'s in month format", m, greg_month(6));
|
||||
ss >> mx;
|
||||
check_equal("Multiple literal '%'s in month format", mx, greg_month(6));
|
||||
|
||||
f->weekday_format("%%a %a");
|
||||
ss.str("%a Tue");
|
||||
ss >> gw;
|
||||
check_equal("Literal '%' in weekday format", gw, greg_weekday(2));
|
||||
ss >> gwx;
|
||||
check_equal("Literal '%' in weekday format", gwx, greg_weekday(2));
|
||||
f->weekday_format("%%%a");
|
||||
ss.str("%Tue");
|
||||
ss >> gw;
|
||||
check_equal("Multiple literal '%'s in weekday format", gw, greg_weekday(2));
|
||||
ss >> gwx;
|
||||
check_equal("Multiple literal '%'s in weekday format", gwx, greg_weekday(2));
|
||||
|
||||
f->year_format("%%Y %Y");
|
||||
ss.str("%Y 2005");
|
||||
@@ -258,16 +258,16 @@ int main(){
|
||||
check_equal("Default period (closed range)", dp, date_period(begin,len));
|
||||
{
|
||||
std::stringstream ss;
|
||||
date d(not_a_date_time);
|
||||
date dx(not_a_date_time);
|
||||
date d2 = day_clock::local_day();
|
||||
date d3(neg_infin);
|
||||
date d4(pos_infin);
|
||||
date_period dp(d2, d); // date/nadt
|
||||
date_period dp2(d, d); // nadt/nadt
|
||||
date_period dpx(d2, dx); // date/nadt
|
||||
date_period dp2(dx, dx); // nadt/nadt
|
||||
date_period dp3(d3, d4);
|
||||
ss << dp;
|
||||
ss << dpx;
|
||||
ss >> dp2;
|
||||
check_equal("Special values period (reversibility test)", dp, dp2);
|
||||
check_equal("Special values period (reversibility test)", dpx, dp2);
|
||||
ss.str("[-infinity/+infinity]");
|
||||
ss >> dp2;
|
||||
check_equal("Special values period (infinities)", dp3, dp2);
|
||||
@@ -480,7 +480,7 @@ int main(){
|
||||
// create date_generator_parser
|
||||
typedef boost::date_time::date_generator_parser<date,char> date_gen_parser;
|
||||
date_gen_parser dg_parser("Zuerst","Zweitens","Dritt","Viert",
|
||||
"Fünft","Letzt","Vor","Nach","Von");
|
||||
"F\xC3\xBCnft","Letzt","Vor","Nach","Von");
|
||||
|
||||
// create the date_input_facet
|
||||
date_input_facet* de_facet =
|
||||
@@ -489,29 +489,29 @@ int main(){
|
||||
sv_parser,
|
||||
p_parser,
|
||||
dg_parser);
|
||||
std::istringstream iss;
|
||||
iss.imbue(std::locale(std::locale::classic(), de_facet));
|
||||
std::istringstream iss2;
|
||||
iss2.imbue(std::locale(std::locale::classic(), de_facet));
|
||||
// June 06 2005, Dec, minimum date, Tues
|
||||
iss.str("Juni 06 2005 Dez Wenigstes Datum Die");
|
||||
iss >> d;
|
||||
iss >> m;
|
||||
iss2.str("Juni 06 2005 Dez Wenigstes Datum Die");
|
||||
iss2 >> d;
|
||||
iss2 >> m;
|
||||
check_equal("German names: date", d, date(2005, Jun, 6));
|
||||
check_equal("German names: month", m, greg_month(Dec));
|
||||
iss >> d;
|
||||
iss >> gw;
|
||||
iss2 >> d;
|
||||
iss2 >> gw;
|
||||
check_equal("German names: special value date", d, date(min_date_time));
|
||||
check_equal("German names: short weekday", gw, greg_weekday(Tuesday));
|
||||
de_facet->weekday_format("%A"); // long weekday
|
||||
// Tuesday, Second Tuesday of Mar
|
||||
iss.str("Dienstag Zweitens Dienstag von Mar");
|
||||
iss >> gw;
|
||||
iss >> nkd;
|
||||
iss2.str("Dienstag Zweitens Dienstag von Mar");
|
||||
iss2 >> gw;
|
||||
iss2 >> nkd;
|
||||
check_equal("German names: long weekday", gw, greg_weekday(Tuesday));
|
||||
check_equal("German names, nth_day_of_the_week_in_month",
|
||||
nkd.get_date(2005), date(2005,Mar,8));
|
||||
// Tuesday after
|
||||
iss.str("Dienstag Nach");
|
||||
iss >> fka;
|
||||
iss2.str("Dienstag Nach");
|
||||
iss2 >> fka;
|
||||
check_equal("German names, first_day_of_the_week_after",
|
||||
fka.get_date(date(2005,Apr,5)), date(2005,Apr,12));
|
||||
}
|
||||
@@ -552,25 +552,25 @@ int main(){
|
||||
&month_long_names[12],
|
||||
std::back_inserter(long_month_names));
|
||||
|
||||
date d(not_a_date_time);
|
||||
date_input_facet* facet = new date_input_facet();
|
||||
date dx(not_a_date_time);
|
||||
date_input_facet* facetx = new date_input_facet();
|
||||
std::stringstream ss;
|
||||
ss.imbue(std::locale(std::locale::classic(), facet));
|
||||
facet->short_month_names(short_month_names);
|
||||
facet->short_weekday_names(short_weekday_names);
|
||||
facet->long_month_names(long_month_names);
|
||||
facet->long_weekday_names(long_weekday_names);
|
||||
facet->format("%a %b %d, %Y");
|
||||
ss.imbue(std::locale(std::locale::classic(), facetx));
|
||||
facetx->short_month_names(short_month_names);
|
||||
facetx->short_weekday_names(short_weekday_names);
|
||||
facetx->long_month_names(long_month_names);
|
||||
facetx->long_weekday_names(long_weekday_names);
|
||||
facetx->format("%a %b %d, %Y");
|
||||
ss.str("day7 *apr* 23, 2005");
|
||||
ss >> d;
|
||||
check_equal("Short custom names, set via accessor function", d.day_of_week(), greg_weekday(6));
|
||||
check_equal("Short custom names, set via accessor function", d.month(), greg_month(4));
|
||||
ss >> dx;
|
||||
check_equal("Short custom names, set via accessor function", dx.day_of_week(), greg_weekday(6));
|
||||
check_equal("Short custom names, set via accessor function", dx.month(), greg_month(4));
|
||||
ss.str("");
|
||||
ss.str("Sun-0 **April** 24, 2005");
|
||||
facet->format("%A %B %d, %Y");
|
||||
ss >> d;
|
||||
check_equal("Long custom names, set via accessor function", d.day_of_week(), greg_weekday(0));
|
||||
check_equal("Long custom names, set via accessor function", d.month(), greg_month(4));
|
||||
facetx->format("%A %B %d, %Y");
|
||||
ss >> dx;
|
||||
check_equal("Long custom names, set via accessor function", dx.day_of_week(), greg_weekday(0));
|
||||
check_equal("Long custom names, set via accessor function", dx.month(), greg_month(4));
|
||||
|
||||
}
|
||||
#else
|
||||
|
||||
@@ -81,12 +81,12 @@ main()
|
||||
ss.str() == std::string("Okt"));
|
||||
|
||||
ss.str(""); //reset string stream
|
||||
greg_month m(Oct);
|
||||
month_formatter::format_month(m, ss, gdnp);
|
||||
greg_month mo(Oct);
|
||||
month_formatter::format_month(mo, ss, gdnp);
|
||||
check("check german short month: " + ss.str(),
|
||||
ss.str() == std::string("Okt"));
|
||||
ss.str(""); //reset string stream
|
||||
// month_formatter::format_month(m, ss, gdnp);
|
||||
// month_formatter::format_month(mo, ss, gdnp);
|
||||
// check("check german long month: " + ss.str(),
|
||||
// ss.str() == std::string("Oktober"));
|
||||
|
||||
@@ -277,7 +277,7 @@ main()
|
||||
/*******************************************************************/
|
||||
{
|
||||
std::stringstream ss1("January");
|
||||
std::stringstream ss2("dec"); // misspelled
|
||||
std::stringstream ss2m("dec"); // misspelled
|
||||
std::stringstream german("Okt");
|
||||
german.imbue(global2);
|
||||
greg_month m(3);
|
||||
@@ -293,7 +293,7 @@ main()
|
||||
german >> m;
|
||||
check("Stream in German month", m == greg_month(Oct));
|
||||
try{
|
||||
ss2 >> m; // misspelled
|
||||
ss2m >> m; // misspelled
|
||||
check("Bad month exception NOT thrown (misspelled name)", false);
|
||||
}catch(bad_month&){
|
||||
check("Bad month exception caught (misspelled name)", true);
|
||||
@@ -306,7 +306,7 @@ main()
|
||||
/*******************************************************************/
|
||||
{
|
||||
std::stringstream ss1("Sun");
|
||||
std::stringstream ss2("Wensday"); // misspelled
|
||||
std::stringstream ss2w("Wensday"); // misspelled
|
||||
std::stringstream german("Mittwoch"); // Wednesday
|
||||
german.imbue(global2);
|
||||
greg_weekday wd(Friday); //something not Sunday...
|
||||
@@ -322,7 +322,7 @@ main()
|
||||
german >> wd;
|
||||
check("Stream in German weekday", wd == greg_weekday(Wednesday));
|
||||
try{
|
||||
ss2 >> wd;
|
||||
ss2w >> wd;
|
||||
check("Bad weekday exception NOT thrown (misspelled name)", false);
|
||||
}catch(bad_weekday&){
|
||||
check("Bad weekday exception caught (misspelled name)", true);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user