Fix clock example doesn't get the correct local time under unix system

There is a long-standing problem (https://github.com/time-rs/time/issues/293) that has not yet been solved by time-rs
Switch to chrono as it seemed to solve the problem (https://github.com/chronotope/chrono/pull/677)
This commit is contained in:
Skygrango 2024-05-03 13:04:39 +08:00
parent fe240a93aa
commit f9124470b4
2 changed files with 13 additions and 16 deletions

View file

@ -8,6 +8,5 @@ publish = false
[dependencies] [dependencies]
iced.workspace = true iced.workspace = true
iced.features = ["canvas", "tokio", "debug"] iced.features = ["canvas", "tokio", "debug"]
chrono = { version = "0.4", features = [ "clock" ] }
time = { version = "0.3", features = ["local-offset"] }
tracing-subscriber = "0.3" tracing-subscriber = "0.3"

View file

@ -7,6 +7,9 @@ use iced::{
Theme, Vector, Theme, Vector,
}; };
use chrono as time;
use time::Timelike;
pub fn main() -> iced::Result { pub fn main() -> iced::Result {
tracing_subscriber::fmt::init(); tracing_subscriber::fmt::init();
@ -18,13 +21,13 @@ pub fn main() -> iced::Result {
} }
struct Clock { struct Clock {
now: time::OffsetDateTime, now: time::DateTime<time::Local>,
clock: Cache, clock: Cache,
} }
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]
enum Message { enum Message {
Tick(time::OffsetDateTime), Tick(time::DateTime<time::Local>),
} }
impl Clock { impl Clock {
@ -54,16 +57,12 @@ impl Clock {
} }
fn subscription(&self) -> Subscription<Message> { fn subscription(&self) -> Subscription<Message> {
iced::time::every(std::time::Duration::from_millis(500)).map(|_| { iced::time::every(std::time::Duration::from_millis(500))
Message::Tick( .map(|_| Message::Tick(time::offset::Local::now()))
time::OffsetDateTime::now_local()
.unwrap_or_else(|_| time::OffsetDateTime::now_utc()),
)
})
} }
fn theme(&self) -> Theme { fn theme(&self) -> Theme {
Theme::ALL[(self.now.unix_timestamp() as usize / 10) % Theme::ALL.len()] Theme::ALL[(self.now.timestamp() as usize / 10) % Theme::ALL.len()]
.clone() .clone()
} }
} }
@ -71,8 +70,7 @@ impl Clock {
impl Default for Clock { impl Default for Clock {
fn default() -> Self { fn default() -> Self {
Self { Self {
now: time::OffsetDateTime::now_local() now: time::offset::Local::now(),
.unwrap_or_else(|_| time::OffsetDateTime::now_utc()),
clock: Cache::default(), clock: Cache::default(),
} }
} }
@ -127,17 +125,17 @@ impl<Message> canvas::Program<Message> for Clock {
frame.translate(Vector::new(center.x, center.y)); frame.translate(Vector::new(center.x, center.y));
frame.with_save(|frame| { frame.with_save(|frame| {
frame.rotate(hand_rotation(self.now.hour(), 12)); frame.rotate(hand_rotation(self.now.hour() as u8, 12));
frame.stroke(&short_hand, wide_stroke()); frame.stroke(&short_hand, wide_stroke());
}); });
frame.with_save(|frame| { frame.with_save(|frame| {
frame.rotate(hand_rotation(self.now.minute(), 60)); frame.rotate(hand_rotation(self.now.minute() as u8, 60));
frame.stroke(&long_hand, wide_stroke()); frame.stroke(&long_hand, wide_stroke());
}); });
frame.with_save(|frame| { frame.with_save(|frame| {
let rotation = hand_rotation(self.now.second(), 60); let rotation = hand_rotation(self.now.second() as u8, 60);
frame.rotate(rotation); frame.rotate(rotation);
frame.stroke(&long_hand, thin_stroke()); frame.stroke(&long_hand, thin_stroke());