@@ -50,7 +50,20 @@ pub fn human_duration(duration: Duration) -> String {
5050 } else if duration. num_minutes ( ) < 5 {
5151 format ! ( "{}s" , duration. num_seconds( ) )
5252 } else {
53- format ! ( "{}m" , duration. num_minutes( ) )
53+ let minutes = duration. num_minutes ( ) ;
54+ if minutes < 90 {
55+ format ! ( "{}m" , duration. num_minutes( ) )
56+ } else {
57+ let hours = minutes / 60 ;
58+ let minutes = minutes % 60 ;
59+ if hours < 24 {
60+ format ! ( "{}h {}m" , hours, minutes)
61+ } else {
62+ let days = hours / 24 ;
63+ let hours = hours % 24 ;
64+ format ! ( "{}d {}h {}m" , days, hours, minutes)
65+ }
66+ }
5467 }
5568}
5669
@@ -76,3 +89,35 @@ pub fn date_time(date: &DateTime<Utc>) -> String {
7689 let date = DateTime :: < Local > :: from ( * date) ;
7790 date. format ( "%Y-%m-%d %H:%M:%S%Z" ) . to_string ( )
7891}
92+
93+ #[ cfg( test) ]
94+ mod test {
95+ use super :: * ;
96+
97+ #[ test]
98+ fn test_human_duration ( ) {
99+ let duration = Duration :: seconds ( 1 ) ;
100+ assert_eq ! ( human_duration( duration) , "1000ms" ) ;
101+
102+ let duration = Duration :: seconds ( 10 ) ;
103+ assert_eq ! ( human_duration( duration) , "10s" ) ;
104+
105+ let duration = Duration :: minutes ( 5 ) ;
106+ assert_eq ! ( human_duration( duration) , "5m" ) ;
107+
108+ let duration = Duration :: hours ( 1 ) ;
109+ assert_eq ! ( human_duration( duration) , "60m" ) ;
110+
111+ let duration = Duration :: minutes ( 100 ) ;
112+ assert_eq ! ( human_duration( duration) , "1h 40m" ) ;
113+
114+ let duration = Duration :: days ( 1 ) ;
115+ assert_eq ! ( human_duration( duration) , "1d 0h 0m" ) ;
116+
117+ let duration = Duration :: days ( 1 ) + Duration :: minutes ( 35 ) ;
118+ assert_eq ! ( human_duration( duration) , "1d 0h 35m" ) ;
119+
120+ let duration = Duration :: days ( 1 ) + Duration :: minutes ( 95 ) ;
121+ assert_eq ! ( human_duration( duration) , "1d 1h 35m" ) ;
122+ }
123+ }
0 commit comments