]>
git.proxmox.com Git - ceph.git/blob - ceph/src/include/timegm.h
1 // (C) Copyright Howard Hinnant
2 // (C) Copyright 2010-2011 Vicente J. Botet Escriba
3 // Use, modification and distribution are subject to the Boost Software License,
4 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt).
7 //===-------------------------- locale ------------------------------------===//
9 // The LLVM Compiler Infrastructure
11 // This file is dual licensed under the MIT and the University of Illinois Open
12 // Source Licenses. See LICENSE.TXT for details.
14 //===----------------------------------------------------------------------===//
16 // This code was adapted by Vicente from Howard Hinnant's experimental work
17 // on chrono i/o to Boost and some functions from libc++/locale to emulate the missing time_get::get()
19 #ifndef BOOST_CHRONO_IO_TIME_POINT_IO_H
20 #define BOOST_CHRONO_IO_TIME_POINT_IO_H
24 static int32_t is_leap(int32_t year
) {
34 static int32_t days_from_0(int32_t year
) {
36 return 365 * year
+ (year
/ 400) - (year
/100) + (year
/ 4);
39 int32_t static days_from_1970(int32_t year
) {
40 static const int days_from_0_to_1970
= days_from_0(1970);
41 return days_from_0(year
) - days_from_0_to_1970
;
44 static int32_t days_from_1jan(int32_t year
,int32_t month
,int32_t day
) {
45 static const int32_t days
[2][12] =
47 { 0,31,59,90,120,151,181,212,243,273,304,334},
48 { 0,31,60,91,121,152,182,213,244,274,305,335}
51 return days
[is_leap(year
)][month
-1] + day
- 1;
54 static time_t internal_timegm(tm
const *t
) {
55 int year
= t
->tm_year
+ 1900;
56 int month
= t
->tm_mon
;
64 int years_diff
= (-month
+ 11)/12;
66 month
+=12 * years_diff
;
70 int day_of_year
= days_from_1jan(year
,month
,day
);
71 int days_since_epoch
= days_from_1970(year
) + day_of_year
;
73 time_t seconds_in_day
= 3600 * 24;
74 time_t result
= seconds_in_day
* days_since_epoch
+ 3600 * t
->tm_hour
+ 60 * t
->tm_min
+ t
->tm_sec
;