greg 0.2.5

Simple Unobtrusive Date & Time library
Documentation
/// Create a [`DateTime`](super::DateTime) from `YYYY-MM-DD hh:mm:ss`
///
/// If the `hh:mm:ss` time component is omitted, it defaults to `00:00:00`.
///
/// Unfortunately, using this macro with properly formatted dates like `2022-09-22` triggers the clippy lint `zero_prefixed_literal` for every leading zero (e.g. in `09`).
///```
/// use greg::ymd_hms;
/// use greg::calendar::{DateTime, Date, Time};
/// let dt1: DateTime = ymd_hms!(2022-09-22);
/// let DateTime(date, time) = dt1;
/// assert_eq!(date, Date::ymd(2022, 9, 22));
/// assert_eq!(time, Time::MIDNIGHT);
///
/// let DateTime(date2, time2) = ymd_hms!(2022-09-22 03:00:00);
/// assert_eq!(date, date2);
/// assert_eq!(time2, Time::hms_checked(3, 0, 0));
///```
#[macro_export]
macro_rules! ymd_hms {
	($y:literal-$mo:literal-$d:literal $h:literal:$m:literal:$s:literal) => {
		$crate::calendar::DateTime (
			$crate::calendar::Date::ymd_checked($y, $mo, $d),
			$crate::calendar::Time::hms_checked($h, $m, $s)
		)
	};
	($y:literal-$mo:literal-$d:literal) => {
		$crate::calendar::DateTime (
			$crate::calendar::Date::ymd_checked($y, $mo, $d),
			$crate::calendar::Time::MIDNIGHT
		)
	};
}
/// Create a [`Point`](crate::Point) from `YYYY-MM-DD hh:mm:ss` in UTC
///
/// If the `hh:mm:ss` time component is omitted, it defaults to `00:00:00`.
///
/// Unfortunately, using this macro with properly formatted dates like `2022-09-22` triggers the clippy lint `zero_prefixed_literal` for every leading zero (e.g. in `09`).
///```
/// use greg::{utc, Point, Span};
/// let p1: Point = utc!(2022-09-22);
/// let p2: Point = utc!(2022-09-22 03:00:00);
/// let three_hours = Span::HOUR * 3;
/// assert_eq!(p1 + three_hours, p2);
///```
#[macro_export]
macro_rules! utc {
	($y:literal-$mo:literal-$d:literal $h:literal:$m:literal:$s:literal) => {
		$crate::calendar::Utc::resolve(
			$crate::ymd_hms!($y-$mo-$d $h:$m:$s)
		)
	};
	($y:literal-$mo:literal-$d:literal) => {
		$crate::calendar::Utc::resolve(
			$crate::ymd_hms!($y-$mo-$d)
		)
	};
}

#[test]
fn ymd_hms() {
	use super::{DateTime, Date, Time};
	let DateTime(date, time) = ymd_hms!(2020-01-01 00:00:00);
	assert_eq!(date, Date::ymd(2020, 1, 1));
	assert_eq!(time, Time::MIDNIGHT);
	let DateTime(date, time) = ymd_hms!(2020-01-01);
	assert_eq!(date, Date::ymd(2020, 1, 1));
	assert_eq!(time, Time::MIDNIGHT);
}

#[test]
fn utc() {
	assert_eq!(0, utc!(1970-01-01).timestamp);
	assert_eq!(0, utc!(1970-01-01 00:00:00).timestamp);

	assert_eq!(1514764800, utc!(2018-01-01).timestamp);
	assert_eq!(1514764800, utc!(2018-01-01 00:00:00).timestamp);

	assert_eq!(1641168000, utc!(2022-01-03).timestamp);
	assert_eq!(1641168000, utc!(2022-01-03 00:00:00).timestamp);

	assert_eq!(1582934400, utc!(2020-02-29).timestamp);
	assert_eq!(1582934400, utc!(2020-02-29 00:00:00).timestamp);

	assert_eq!(1583020800, utc!(2020-03-01).timestamp);
	assert_eq!(1583020800, utc!(2020-03-01 00:00:00).timestamp);
}