1use crate::{
2 time::{CustomFormat, Format},
3 Time,
4};
5
6pub const SHORT: CustomFormat = CustomFormat("%Y-%m-%d");
8
9pub const RFC2822: CustomFormat = CustomFormat("%a, %d %b %Y %H:%M:%S %z");
11
12pub const GIT_RFC2822: CustomFormat = CustomFormat("%a, %-d %b %Y %H:%M:%S %z");
14
15pub const ISO8601: CustomFormat = CustomFormat("%Y-%m-%d %H:%M:%S %z");
17
18pub const ISO8601_STRICT: CustomFormat = CustomFormat("%Y-%m-%dT%H:%M:%S%:z");
20
21pub const UNIX: Format = Format::Unix;
23
24pub const RAW: Format = Format::Raw;
26
27pub const GITOXIDE: CustomFormat = CustomFormat("%a %b %d %Y %H:%M:%S %z");
29
30pub const DEFAULT: CustomFormat = CustomFormat("%a %b %-d %H:%M:%S %Y %z");
32
33impl Time {
35 pub fn format(&self, format: impl Into<Format>) -> Result<String, jiff::Error> {
42 self.format_inner(format.into())
43 }
44
45 pub fn format_or_unix(&self, format: impl Into<Format>) -> String {
48 self.format_inner(format.into())
49 .unwrap_or_else(|_| self.seconds.to_string())
50 }
51
52 fn format_inner(&self, format: Format) -> Result<String, jiff::Error> {
53 Ok(match format {
54 Format::Custom(CustomFormat(format)) => self.to_zoned()?.strftime(format).to_string(),
55 Format::Unix => self.seconds.to_string(),
56 Format::Raw => self.to_string(),
57 })
58 }
59}
60
61impl Time {
62 pub fn to_zoned(self) -> Result<jiff::Zoned, jiff::Error> {
64 let offset = jiff::tz::Offset::from_seconds(self.offset)?;
65 Ok(jiff::Timestamp::from_second(self.seconds)?.to_zoned(offset.to_time_zone()))
66 }
67}