tailhook / humantime

A parser and formatter for std::time::{SystemTime, Duration}
Apache License 2.0
285 stars 36 forks source link

approximate time formatting? #4

Closed droundy closed 6 years ago

droundy commented 6 years ago

When I saw the title "humantime", I thought I'd have something that I could use to give a friendly output of how long my program has run (i.e. when it's been running for 36 days, I don't care about picoseconds).

Would adding that as a feature be of interest?

tailhook commented 6 years ago

Currently, you can do that by truncating the value. I.e. to skip fracional seconds, use:

let truncated = Duration::new(original_duration.as_secs(), 0)

To show days:

let truncated = Duration::new((original_duration.as_secs() / 86400)*86400, 0)

In this scenario, an application chooses the granularity, though. And I don't think there is one size fits all approach for that. I.e. one app may show just the number of days when the duration is > 24 hours, and the other could print "1day 8h" up to 5 days.

Currently, the priority of the library is being extremely stable, as it's used in env_logger which is used for every other rust program. So I don't think we can afford to add such functionality since I expect it to be backed in multiple iterations. However, we may add one eventually.

What do you think?

droundy commented 6 years ago

If I have to do the truncation myself then humantime isn't gaining my anything. That's fine, it's just a few lines of code that I have copied from c++ project to project for years. I just thought I'd mention it as a useful human friendly time feature missing from the library.

tailhook commented 6 years ago

Yes, it's easy as long as you solving a very specific problem. And much harder when you're trying to make a library suitable for a lot of users with different use cases. So closing this for now.

theduke commented 4 years ago

A relatively simple method that allows specifying the maximum amount of units would be very handy.

Eg format_duration_with_depth(my_duration, 1)

1 would mean only the largest unit (3 years, 7 months, ...) 2 the two largest (3 years, 2 months, 1 month, 7 days, ...).

tailhook commented 4 years ago

Well that's interesting. But different kinds of rounding might also be needed for this case.

manio commented 2 years ago

@tailhook I have the following code:

let val1 = Duration::from_secs_f32(30.0);
println!("{}", format_duration(val1).to_string());

and it produces: 30s 1us 24ns

Who to blame? :) ps. I cannot use Duration::new because sometimes i need eg 2.5sec...

manio commented 2 years ago

Filled a bug: https://github.com/rust-lang/rust/issues/90225

tailhook commented 2 years ago

Yes, that's a duration constructor error, not formatting issue.