Duration and Period
Published:
I’m in the process or tidying up the bot behind
TorAtlas and I’ve chosen to write it in Java.
My undergraduate degree had a lot of Java in it, but that was while ago now,
and there are some cool new features I’ve learnt about including Period
and
Duration
.
Some of the tweets coming from the bot talk about how long a relay has been
contributing to the Tor network. When fetching the details
document I look at the
first_seen
field and get this as a
ZonedDateTime
to make sure I’m doing all my calculations in UTC. I then use the between()
method on various ChronoUnit
s to work out how long between the first time the
relay was seen and now, and then I produced something human readable from this:
public static String formatAge(Temporal first_seen_date) {
int years = (int) ChronoUnit.YEARS.between(first_seen_date, ZonedDateTime.now(ZoneOffset.UTC));
int days = (int) ChronoUnit.DAYS.between(first_seen_date, ZonedDateTime.now(ZoneOffset.UTC));
int hours = (int) ChronoUnit.HOURS.between(first_seen_date, ZonedDateTime.now(ZoneOffset.UTC));
int minutes = (int) ChronoUnit.MINUTES.between(first_seen_date, ZonedDateTime.now(ZoneOffset.UTC));
int seconds = (int) ChronoUnit.SECONDS.between(first_seen_date, ZonedDateTime.now(ZoneOffset.UTC));
if (years > 0) {
return String.format("%s years and %s days", years, (days % 365));
} else if (days > 0) {
return String.format("%s days and %s hours", days, (hours % 24));
} else if (hours > 0) {
return String.format("%s hours and %s minutes", hours, (minutes % 60));
} else if (minutes > 0) {
return String.format("%s minutes and %s seconds", minutes, (seconds % 60));
} else {
return String.format("%s seconds", seconds);
}
}
I would be very happy if I could find something to accept a Duration
instead,
and produce a human-readable representation. I haven’t found anything quite
like the library I was using in Python. I also have a restriction that I’d like
things to be installable from Debian, so any new library would need to be
something that could be maintained in Debian (i.e. active upstream and
DFSG-compliant).
In Python, I used
humanfriendly.format_timespan()
which is a lovely library. If you’re writing Python, I’d definitely recommend
it.