8#ifndef INCLUDED_BDLT_DATETIME
9#define INCLUDED_BDLT_DATETIME
284#include <bdlscm_version.h>
309#include <bsl_iosfwd.h>
310#include <bsl_cstring.h>
311#include <bsl_sstream.h>
333 k_NUM_TIME_BITS = 37,
334 k_DEFAULT_FRACTIONAL_SECOND_PRECISION = 6
359 template <
class HASHALG>
389 bool validateAndTraceLogRepresentation()
const;
904 template <
class STREAM>
978 int fractionalSecondPrecision = 6)
const;
991 template <
class STREAM>
1008 bsl::ostream&
print(bsl::ostream& stream,
1010 int spacesPerLevel = 4)
const;
1012#ifndef BDE_OPENSOURCE_PUBLICATION
1021#ifndef BDE_OMIT_INTERNAL_DEPRECATED
1033 bsl::ostream&
streamOut(bsl::ostream& stream)
const;
1175template <
class HASHALG>
1193 d_value |= k_REP_MASK;
1200 if (validateAndTraceLogRepresentation()) {
1207 + (value & k_TIME_MASK);
1210 return (value >> k_NUM_TIME_BITS)
1214#if BSLS_PLATFORM_IS_LITTLE_ENDIAN
1231 if (validateAndTraceLogRepresentation()) {
1235#if BSLS_PLATFORM_IS_LITTLE_ENDIAN
1243 return (days << k_NUM_TIME_BITS)
1249bool Datetime::validateAndTraceLogRepresentation()
const
1255 0 &&
"detected invalid `bdlt::Datetime`; see TEAM 579660115");
1257 "detected invalid `bdlt::Datetime`; see TEAM 579660115");
1293 if (versionSelector >= 20160411) {
1304 d_value |= k_REP_MASK;
1309: d_value(static_cast<
bsls::Types::Uint64>(date -
Date()) << k_NUM_TIME_BITS)
1311 d_value |= k_REP_MASK;
1342: d_value(original.d_value)
1344 d_value = updatedRepresentation();
1351 d_value = rhs.d_value;
1352 d_value = updatedRepresentation();
1362 k_MAX_US_FROM_EPOCH - microsecondsFromEpoch()));
1366 microsecondsFromEpoch()));
1369 microsecondsFromEpoch() + rhs.totalMicroseconds();
1370 setMicrosecondsFromEpoch(totalMicroseconds);
1380 k_MAX_US_FROM_EPOCH - microsecondsFromEpoch()));
1384 microsecondsFromEpoch()));
1387 microsecondsFromEpoch() - rhs.totalMicroseconds();
1388 setMicrosecondsFromEpoch(totalMicroseconds);
1398 k_MAX_US_FROM_EPOCH - microsecondsFromEpoch()));
1402 microsecondsFromEpoch()));
1405 microsecondsFromEpoch() + rhs.totalMicroseconds();
1406 setMicrosecondsFromEpoch(totalMicroseconds);
1416 k_MAX_US_FROM_EPOCH - microsecondsFromEpoch()));
1420 microsecondsFromEpoch()));
1423 microsecondsFromEpoch() - rhs.totalMicroseconds();
1424 setMicrosecondsFromEpoch(totalMicroseconds);
1454 d_value |= k_REP_MASK;
1463 + (
time -
Time(0)).totalMicroseconds();
1471 d_value |= k_REP_MASK;
1511 enum { k_SUCCESS = 0, k_FAILURE = -1 };
1542 enum { k_SUCCESS = 0, k_FAILURE = -1 };
1568 d_value = updatedRepresentation();
1572 | (d_value & k_TIME_MASK);
1574 d_value |= k_REP_MASK;
1588 enum { k_SUCCESS = 0, k_FAILURE = -1 };
1610 enum { k_SUCCESS = 0, k_FAILURE = -1 };
1622 d_value = updatedRepresentation();
1625 d_value = (d_value & k_DATE_MASK)
1626 | (
time -
Time(0)).totalMicroseconds();
1656 d_value = updatedRepresentation();
1663 + (d_value & k_DATE_MASK);
1673 enum { k_SUCCESS = 0, k_FAILURE = -1 };
1699 d_value = updatedRepresentation();
1705 d_value = microseconds | (d_value & k_DATE_MASK);
1715 enum { k_SUCCESS = 0, k_FAILURE = -1 };
1730 d_value = updatedRepresentation();
1738 d_value = microseconds | (d_value & k_DATE_MASK);
1742 | (d_value & k_DATE_MASK);
1749 enum { k_SUCCESS = 0, k_FAILURE = -1 };
1764 d_value = updatedRepresentation();
1772 d_value = microseconds | (d_value & k_DATE_MASK);
1776 | (d_value & k_DATE_MASK);
1783 enum { k_SUCCESS = 0, k_FAILURE = -1 };
1798 d_value = updatedRepresentation();
1806 d_value = microseconds | (d_value & k_DATE_MASK);
1810 | (d_value & k_DATE_MASK);
1817 enum { k_SUCCESS = 0, k_FAILURE = -1 };
1832 d_value = updatedRepresentation();
1839 d_value = microseconds | (d_value & k_DATE_MASK);
1849 enum { k_SUCCESS = 0, k_FAILURE = -1 };
1863 d_value = updatedRepresentation();
1874 enum { k_SUCCESS = 0, k_FAILURE = -1 };
1918 if (days > 0 && microseconds < 0) {
1922 else if (days < 0 && microseconds > 0) {
1932 ((k_MAX_US_FROM_EPOCH - totalMicroseconds)
1940 (k_MAX_US_FROM_EPOCH - totalMicroseconds));
1942 (totalMicroseconds));
1944 totalMicroseconds += microseconds;
1948 setMicrosecondsFromEpoch(totalMicroseconds);
1960 enum { k_SUCCESS = 0, k_FAILURE = -1 };
1990 if (days > 0 && microseconds < 0) {
1994 else if (days < 0 && microseconds > 0) {
2004 ((k_MAX_US_FROM_EPOCH - totalMicroseconds)
2014 (k_MAX_US_FROM_EPOCH - totalMicroseconds)
2016 (totalMicroseconds))) {
2020 totalMicroseconds += microseconds;
2024 setMicrosecondsFromEpoch(totalMicroseconds);
2032 ((k_MAX_US_FROM_EPOCH - microsecondsFromEpoch())
2040 + totalMicroseconds);
2048 enum { k_SUCCESS = 0, k_FAILURE = -1 };
2051 ((k_MAX_US_FROM_EPOCH - microsecondsFromEpoch())
2065 ((k_MAX_US_FROM_EPOCH - microsecondsFromEpoch())
2073 + totalMicroseconds);
2080 enum { k_SUCCESS = 0, k_FAILURE = -1 };
2083 ((k_MAX_US_FROM_EPOCH - microsecondsFromEpoch())
2097 ((k_MAX_US_FROM_EPOCH - microsecondsFromEpoch())
2105 + totalMicroseconds);
2112 enum { k_SUCCESS = 0, k_FAILURE = -1 };
2115 ((k_MAX_US_FROM_EPOCH - microsecondsFromEpoch())
2129 ((k_MAX_US_FROM_EPOCH - microsecondsFromEpoch())
2137 + totalMicroseconds);
2144 enum { k_SUCCESS = 0, k_FAILURE = -1 };
2147 ((k_MAX_US_FROM_EPOCH - microsecondsFromEpoch())
2161 (k_MAX_US_FROM_EPOCH - microsecondsFromEpoch()));
2163 (microsecondsFromEpoch()));
2167 setMicrosecondsFromEpoch(microseconds + totalMicroseconds);
2175 enum { k_SUCCESS = 0, k_FAILURE = -1 };
2178 (k_MAX_US_FROM_EPOCH - microsecondsFromEpoch())
2180 (microsecondsFromEpoch())) {
2189template <
class STREAM>
2199 stream.getUint64(tmp);
2204 d_value |= k_REP_MASK;
2207 stream.invalidate();
2221 stream.invalidate();
2225 stream.invalidate();
2238 return Date() +
static_cast<int>(value >> k_NUM_TIME_BITS);
2264 int *microsecond)
const
2272 *
minute =
static_cast<int>( microseconds
2277 *
second =
static_cast<int>( microseconds
2313 return static_cast<int>( microseconds
2323 return static_cast<int>( microseconds
2339 return static_cast<int>( microseconds
2366template <
class STREAM>
2373 updatedRepresentation() & (~k_REP_MASK);
2375 stream.putUint64(value);
2382 stream.invalidate();
2389#ifndef BDE_OPENSOURCE_PUBLICATION
2397#ifndef BDE_OMIT_INTERNAL_DEPRECATED
2407 return stream << *
this;
2437 Datetime result(lhs);
2439 return result += rhs;
2444 const Datetime& rhs)
2446 Datetime result(rhs);
2448 return result +=
lhs;
2453 const DatetimeInterval& rhs)
2455 Datetime result(lhs);
2457 return result +=
rhs;
2462 const Datetime& rhs)
2464 Datetime result(rhs);
2466 return result +=
lhs;
2473 Datetime result(lhs);
2475 return result -=
rhs;
2480 const DatetimeInterval& rhs)
2482 Datetime result(lhs);
2484 return result -=
rhs;
2489 const Datetime& rhs)
2494 if (lhsTotalMicroseconds >= rhsTotalMicroseconds) {
2495 lhsTotalMicroseconds -= rhsTotalMicroseconds;
2498 0, 0, 0, 0, 0, lhsTotalMicroseconds);
2501 rhsTotalMicroseconds -= lhsTotalMicroseconds;
2513 return lhsValue == rhsValue;
2522 return lhsValue != rhsValue;
2534 return lhsValue < rhsValue;
2546 return lhsValue <= rhsValue;
2558 return lhsValue > rhsValue;
2570 return lhsValue >= rhsValue;
2574template <
class HASHALG>
2578 using ::BloombergLP::bslh::hashAppend;
2579 hashAppend(hashAlg,
object.updatedRepresentation());
Definition bdlt_date.h:294
int dayOfYear() const
Return the day of the year in the range [1 .. 366] of this date.
Definition bdlt_date.h:968
static bool isValidYearDay(int year, int dayOfYear)
Definition bdlt_date.h:781
int day() const
Return the day of the month in the range [1 .. 31] of this date.
Definition bdlt_date.h:955
int year() const
Return the year in the range [1 .. 9999] of this date.
Definition bdlt_date.h:1005
static bool isValidYearMonthDay(int year, int month, int day)
Definition bdlt_date.h:787
STREAM & bdexStreamOut(STREAM &stream, int version) const
Definition bdlt_date.h:1013
int month() const
Return the month of the year in the range [1 .. 12] of this date.
Definition bdlt_date.h:993
DayOfWeek::Enum dayOfWeek() const
Definition bdlt_date.h:961
STREAM & bdexStreamIn(STREAM &stream, int version)
Definition bdlt_date.h:924
Definition bdlt_datetimeinterval.h:201
Definition bdlt_datetime.h:330
int setHourIfValid(int hour)
Definition bdlt_datetime.h:1713
Date date() const
Return the value of the "date" part of this object.
Definition bdlt_datetime.h:2234
static int maxSupportedVersion()
Definition bdlt_datetime.h:2399
int addMillisecondsIfValid(bsls::Types::Int64 milliseconds)
Definition bdlt_datetime.h:2142
int addMicrosecondsIfValid(bsls::Types::Int64 microseconds)
Definition bdlt_datetime.h:2173
Datetime()
Definition bdlt_datetime.h:1301
int year() const
Return the value of the year attribute of this object.
Definition bdlt_datetime.h:2359
int addDaysIfValid(int days)
Definition bdlt_datetime.h:1872
int addMinutesIfValid(bsls::Types::Int64 minutes)
Definition bdlt_datetime.h:2078
friend bool operator!=(const Datetime &, const Datetime &)
void setTime(const Time &time)
Definition bdlt_datetime.h:1620
int printToBuffer(char *result, int numBytes, int fractionalSecondPrecision=6) const
void setMinute(int minute)
Definition bdlt_datetime.h:1725
int hour() const
Return the value of the hour attribute of this object.
Definition bdlt_datetime.h:2293
int minute() const
Return the value of the minute attribute of this object.
Definition bdlt_datetime.h:2319
int millisecond() const
Return the value of the millisecond attribute of this object.
Definition bdlt_datetime.h:2309
Datetime & addTime(bsls::Types::Int64 hours, bsls::Types::Int64 minutes=0, bsls::Types::Int64 seconds=0, bsls::Types::Int64 milliseconds=0, bsls::Types::Int64 microseconds=0)
Definition bdlt_datetime.h:1884
void setDatetime(const Date &date, int hour=0, int minute=0, int second=0, int millisecond=0, int microsecond=0)
Definition bdlt_datetime.h:1430
Datetime & addMinutes(bsls::Types::Int64 minutes)
Definition bdlt_datetime.h:2062
int setDatetimeIfValid(int year, int month, int day, int hour=0, int minute=0, int second=0, int millisecond=0, int microsecond=0)
Definition bdlt_datetime.h:1502
int microsecond() const
Return the value of the microsecond attribute of this object.
Definition bdlt_datetime.h:2301
int addSecondsIfValid(bsls::Types::Int64 seconds)
Definition bdlt_datetime.h:2110
int validateAndSetDatetime(int year, int month, int day, int hour=0, int minute=0, int second=0, int millisecond=0)
Definition bdlt_datetime.h:2411
bsl::ostream & streamOut(bsl::ostream &stream) const
Definition bdlt_datetime.h:2405
Datetime & addMicroseconds(bsls::Types::Int64 microseconds)
Definition bdlt_datetime.h:2158
int setMillisecondIfValid(int millisecond)
Definition bdlt_datetime.h:1815
Datetime & addHours(bsls::Types::Int64 hours)
Definition bdlt_datetime.h:2029
void setHour(int hour)
Definition bdlt_datetime.h:1694
void setMicrosecond(int microsecond)
Definition bdlt_datetime.h:1827
static int maxSupportedBdexVersion()
Definition bdlt_datetime.h:2391
bsl::ostream & print(bsl::ostream &stream, int level=0, int spacesPerLevel=4) const
Time time() const
Return the value of the "time" part of this object.
Definition bdlt_datetime.h:2345
friend bool operator==(const Datetime &, const Datetime &)
static bool isValid(int year, int month, int day, int hour=0, int minute=0, int second=0, int millisecond=0, int microsecond=0)
Definition bdlt_datetime.h:1264
Datetime & operator-=(const bsls::TimeInterval &rhs)
Definition bdlt_datetime.h:1376
friend void hashAppend(HASHALG &hashAlg, const Datetime &)
friend DatetimeInterval operator-(const Datetime &, const Datetime &)
int setYearDayIfValid(int year, int dayOfYear)
Definition bdlt_datetime.h:1586
int setYearMonthDayIfValid(int year, int month, int day)
Definition bdlt_datetime.h:1608
Datetime & addSeconds(bsls::Types::Int64 seconds)
Definition bdlt_datetime.h:2094
friend bool operator>(const Datetime &, const Datetime &)
STREAM & bdexStreamOut(STREAM &stream, int version) const
Definition bdlt_datetime.h:2367
DayOfWeek::Enum dayOfWeek() const
Definition bdlt_datetime.h:2248
friend bool operator>=(const Datetime &, const Datetime &)
void setSecond(int second)
Definition bdlt_datetime.h:1759
void setYearDay(int year, int dayOfYear)
Definition bdlt_datetime.h:1578
Datetime & addDays(int days)
Definition bdlt_datetime.h:1859
Datetime & addMilliseconds(bsls::Types::Int64 milliseconds)
Definition bdlt_datetime.h:2126
int second() const
Return the value of the second attribute of this object.
Definition bdlt_datetime.h:2335
int month() const
Return the value of the month attribute of this object.
Definition bdlt_datetime.h:2329
friend bool operator<=(const Datetime &, const Datetime &)
void getTime(int *hour, int *minute=0, int *second=0, int *millisecond=0, int *microsecond=0) const
Definition bdlt_datetime.h:2260
Datetime & operator=(const Datetime &rhs)
Definition bdlt_datetime.h:1349
int setMicrosecondIfValid(int microsecond)
Definition bdlt_datetime.h:1847
void setMillisecond(int millisecond)
Definition bdlt_datetime.h:1793
~Datetime()=default
Destroy this Datetime object.
int setTimeIfValid(int hour, int minute=0, int second=0, int millisecond=0, int microsecond=0)
Definition bdlt_datetime.h:1667
int setMinuteIfValid(int minute)
Definition bdlt_datetime.h:1747
friend bool operator<(const Datetime &, const Datetime &)
void setYearMonthDay(int year, int month, int day)
Definition bdlt_datetime.h:1598
STREAM & bdexStreamIn(STREAM &stream, int version)
Definition bdlt_datetime.h:2190
Datetime & operator+=(const bsls::TimeInterval &rhs)
Definition bdlt_datetime.h:1358
int addHoursIfValid(bsls::Types::Int64 hours)
Definition bdlt_datetime.h:2046
int dayOfYear() const
Return the value of the dayOfYear attribute of this object.
Definition bdlt_datetime.h:2254
void setDate(const Date &date)
Definition bdlt_datetime.h:1566
int setSecondIfValid(int second)
Definition bdlt_datetime.h:1781
int day() const
Definition bdlt_datetime.h:2242
int addTimeIfValid(bsls::Types::Int64 hours, bsls::Types::Int64 minutes=0, bsls::Types::Int64 seconds=0, bsls::Types::Int64 milliseconds=0, bsls::Types::Int64 microseconds=0)
Definition bdlt_datetime.h:1954
Definition bdlt_time.h:195
STREAM & bdexStreamIn(STREAM &stream, int version)
Definition bdlt_time.h:886
STREAM & bdexStreamOut(STREAM &stream, int version) const
Definition bdlt_time.h:966
int hour() const
Return the value of the hour attribute of this time object.
Definition bdlt_time.h:926
Definition bsls_atomic.h:896
Definition bsls_timeinterval.h:307
#define BSLS_ASSERT_SAFE(X)
Definition bsls_assert.h:1917
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_PRECONDITIONS_END()
Definition bsls_preconditions.h:131
#define BSLS_PRECONDITIONS_BEGIN()
Definition bsls_preconditions.h:130
#define BSLS_REVIEW_INVOKE(X)
Definition bsls_review.h:911
void hashAppend(HASH_ALGORITHM &hashAlgorithm, const BigEndianInt16 &object)
Definition bbldc_basicisma30360.h:112
bool operator>(const Date &lhs, const Date &rhs)
bool operator<(const Date &lhs, const Date &rhs)
bool operator==(const Calendar &lhs, const Calendar &rhs)
Date operator-(const Date &date, int numDays)
bool operator>=(const Date &lhs, const Date &rhs)
Date operator+(const Date &date, int numDays)
bsl::ostream & operator<<(bsl::ostream &stream, const Calendar &calendar)
bool operator<=(const Date &lhs, const Date &rhs)
void hashAppend(HASHALG &hashAlg, const Calendar &object)
bool operator!=(const Calendar &lhs, const Calendar &rhs)
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
ALLOCATOR & lhs
Definition bslstl_string.h:3917
Definition bdlbb_blob.h:579
Definition bdlt_iso8601util.h:707
static const bsls::Types::Uint64 k_MAX_VALUE
Definition bdlt_datetimeimputil.h:98
Enum
Enumerated day-of-week values.
Definition bdlt_dayofweek.h:125
Definition bdlt_timeunitratio.h:201
static const bsls::Types::Int64 k_M_PER_D
Definition bdlt_timeunitratio.h:292
static const bsls::Types::Int64 k_S_PER_M
Definition bdlt_timeunitratio.h:287
static const int k_S_PER_M_32
Definition bdlt_timeunitratio.h:341
static const int k_H_PER_D_32
Definition bdlt_timeunitratio.h:348
static const int k_US_PER_MS_32
Definition bdlt_timeunitratio.h:332
static const int k_MS_PER_D_32
Definition bdlt_timeunitratio.h:339
static const bsls::Types::Int64 k_MS_PER_S
Definition bdlt_timeunitratio.h:282
static const bsls::Types::Int64 k_US_PER_H
Definition bdlt_timeunitratio.h:279
static const int k_M_PER_H_32
Definition bdlt_timeunitratio.h:345
static const bsls::Types::Int64 k_M_PER_H
Definition bdlt_timeunitratio.h:291
static const bsls::Types::Int64 k_US_PER_MS
Definition bdlt_timeunitratio.h:275
static const int k_MS_PER_S_32
Definition bdlt_timeunitratio.h:336
static const bsls::Types::Int64 k_US_PER_D
Definition bdlt_timeunitratio.h:280
static const bsls::Types::Int64 k_H_PER_D
Definition bdlt_timeunitratio.h:294
static const bsls::Types::Int64 k_US_PER_S
Definition bdlt_timeunitratio.h:277
static const bsls::Types::Int64 k_US_PER_M
Definition bdlt_timeunitratio.h:278
static const bsls::Types::Int64 k_S_PER_D
Definition bdlt_timeunitratio.h:289
static const bsls::Types::Int64 k_MS_PER_D
Definition bdlt_timeunitratio.h:285
unsigned long long Uint64
Definition bsls_types.h:139
long long Int64
Definition bsls_types.h:134