sp_vcard 0.2.0

Simple vCard library will help you generate vCard
Documentation
use chrono::prelude::*;

#[derive(Debug)]
pub enum DateTimeError {
    InvalidDate,
    InvalidTime,
    InvalidDateTime,
}

pub type DateTimeResult = Result<String, DateTimeError>;

pub struct DateTimeFormatter;

impl DateTimeFormatter {
    pub fn fmt_date_time(
        year: i32,
        month: u32,
        day: u32,
        hour: u32,
        minute: u32,
        second: u32,
    ) -> DateTimeResult {
        match Utc
            .with_ymd_and_hms(year, month, day, hour, minute, second)
            .single()
        {
            Some(dt) => Ok(dt.format("%Y%m%dT%H%M%S").to_string()),
            None => Err(DateTimeError::InvalidDateTime),
        }
    }

    pub fn fmt_time(hour: u32, minute: u32, second: u32) -> DateTimeResult {
        match NaiveTime::from_hms_opt(hour, minute, second) {
            Some(t) => Ok(t.format("%H%M%S").to_string()),
            None => Err(DateTimeError::InvalidTime),
        }
    }

    pub fn fmt_date(year: i32, month: u32, day: u32) -> DateTimeResult {
        let result = NaiveDate::from_ymd_opt(year, month, day);
        match result {
            Some(d) => Ok(d.format("%Y%m%d").to_string()),
            None => Err(DateTimeError::InvalidDate),
        }
    }
}