面试题答案
一键面试use regex::Regex;
use std::fmt;
// 定义一个结构体来存储日期时间信息
#[derive(Debug)]
struct DateTimeInfo {
year: i32,
month: u8,
day: u8,
hour: u8,
minute: u8,
second: u8,
am_pm: Option<String>,
}
impl fmt::Display for DateTimeInfo {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if let Some(ampm) = &self.am_pm {
write!(f, "{:02}/{:02}/{:04} {:02}:{:02}:{:02} {}", self.month, self.day, self.year, self.hour, self.minute, self.second, ampm)
} else {
write!(f, "{:04}-{:02}-{:02} {:02}:{:02}:{:02}", self.year, self.month, self.day, self.hour, self.minute, self.second)
}
}
}
fn parse_date_time(s: &str) -> Option<DateTimeInfo> {
// 定义两种日期格式的正则表达式
let re1 = Regex::new(r"(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})").unwrap();
let re2 = Regex::new(r"(\d{2})/(\d{2})/(\d{4}) (\d{1,2}):(\d{2}):(\d{2}) (AM|PM)").unwrap();
if let Some(captures) = re1.captures(s) {
let year: i32 = captures[1].parse().ok()?;
let month: u8 = captures[2].parse().ok()?;
let day: u8 = captures[3].parse().ok()?;
let hour: u8 = captures[4].parse().ok()?;
let minute: u8 = captures[5].parse().ok()?;
let second: u8 = captures[6].parse().ok()?;
Some(DateTimeInfo {
year,
month,
day,
hour,
minute,
second,
am_pm: None,
})
} else if let Some(captures) = re2.captures(s) {
let year: i32 = captures[3].parse().ok()?;
let month: u8 = captures[1].parse().ok()?;
let day: u8 = captures[2].parse().ok()?;
let mut hour: u8 = captures[4].parse().ok()?;
if captures[6] == "PM" && hour != 12 {
hour += 12;
} else if captures[6] == "AM" && hour == 12 {
hour = 0;
}
let minute: u8 = captures[5].parse().ok()?;
let second: u8 = captures[6].parse().ok()?;
Some(DateTimeInfo {
year,
month,
day,
hour,
minute,
second,
am_pm: Some(captures[6].to_string()),
})
} else {
None
}
}
你可以这样调用这个函数:
fn main() {
let date1 = "2023-10-05 14:30:00";
let date2 = "10/05/2023 02:30:00 PM";
if let Some(info) = parse_date_time(date1) {
println!("Parsed: {}", info);
} else {
println!("Parse failed for date1");
}
if let Some(info) = parse_date_time(date2) {
println!("Parsed: {}", info);
} else {
println!("Parse failed for date2");
}
}
在上述代码中:
- 定义了
DateTimeInfo
结构体来存储日期时间信息,包含年、月、日、时、分、秒以及上午/下午标识(如果有的话)。 parse_date_time
函数使用两个正则表达式分别匹配两种日期格式,成功匹配后解析出相应的日期时间信息并返回Some(DateTimeInfo)
,匹配失败返回None
。- 在
main
函数中,对两种日期格式的字符串进行测试。