1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
use std::time::Instant; use std::fmt; use std::thread; use std::time::{SystemTime, UNIX_EPOCH, Duration}; pub mod units; pub struct Timer{ time: Instant } impl Timer{ ///Creates and starts the timer. /// ///# Examples /// ///``` ///let timer = Timer::new(); ///``` pub fn new() -> Timer{ Timer{time: Instant::now()} } ///Returns the amount of milliseconds since the ///timer was created or reset. ///# Examples /// ///``` ///let timer = timer::new(); ///``` ///Now lets do some operations /// ///``` ///chroniker::sleep(1000); ///``` /// ///Now lets check out the total time passed. ///This will print 1000 or 1001 /// ///``` ///let elapsed_millis = timer.elapsed_millis(); ///println!("Timer: {}", elapsed_millis); ///``` pub fn elapsed_millis(&self) -> u64{ (self.time.elapsed().as_secs() * 1000) + ((self.time.elapsed().subsec_nanos() / 1_000_000) as u64) } ///Resets thes timer to 0 and starts ///counting up again. ///# Examples /// ///``` ///let mut timer = timer::new(); ///chroniker::sleep(1000); ///``` /// ///Now lets check out the total time passed. ///This will print 1000 or 1001 /// ///``` ///let elapsed_millis = timer.elapsed_millis(); ///println!("Timer: {}", elapsed_millis); ///``` /// ///However, if you reset it and then print out the results, ///the program will output 0.000. /// ///``` ///timer.reset(); ///println!("Timer: {:?}", timer); ///``` pub fn reset(&mut self){ self.time = Instant::now(); } } impl fmt::Debug for Timer { ///Prints out the time. ///# Format /// ///If the time is 1500 milliseconds (1.5 seconds) it will print out /// ///``` ///$ 1.500 ///``` /// ///If the time is 75699 milliseconds (1 minute, 15 seconds, and 699 milliseconds) it will print out /// ///``` ///$ 1:15.699 ///``` fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let mut seconds = 0; let mut millis = self.elapsed_millis(); let mut minutes = 0; while millis >= 1000{ millis -= 1000; seconds += 1; } while seconds >= 60{ seconds -= 60; minutes += 1; } if minutes != 0{ return write!(f, "{}:{}.{}", minutes, seconds, millis); } write!(f, "{}.{}", seconds, millis) } } ///Sleeps the thread for the supplied amount of time in /// milliseconds. ///# Examples ///To sleep for one second: /// ///``` ///chroniker::sleep(1000); ///``` /// ///However to sleep for one hour you can use ///the convert function: /// ///``` ///use chroniker::unit; ///chroniker::sleep(unit::covert(TimeUnit::Minutes, TimeUnit::Milliseconds, 60)); ///``` pub fn sleep(time: u64){ thread::sleep(Duration::from_millis(time)); } ///Returns the current time in milliseconds. ///# Examples /// ///``` ///let unix_time = chroniker::current_time_millis(); ///``` pub fn current_time_millis() -> u64{ let start = SystemTime::now(); let since_the_epoch = start.duration_since(UNIX_EPOCH) .expect("Time went backwards"); since_the_epoch.as_secs() * 1000 + since_the_epoch.subsec_nanos() as u64 / 1_000_000 }