package com.faforever.client.util; import com.faforever.client.i18n.I18n; import javax.annotation.Resource; import java.time.Duration; import java.time.Instant; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; import java.time.temporal.TemporalAccessor; import java.util.Locale; import java.util.TimeZone; public class TimeServiceImpl implements TimeService { @Resource I18n i18n; @Resource Locale locale; @Override public String timeAgo(Instant instant) { if (instant == null) { return ""; } Duration ago = Duration.between(instant, Instant.now()); if (Duration.ofMinutes(1).compareTo(ago) > 0) { return i18n.get("secondsAgo", ago.getSeconds()); } if (Duration.ofHours(1).compareTo(ago) > 0) { return i18n.get("minutesAgo", ago.toMinutes()); } if (Duration.ofDays(1).compareTo(ago) > 0) { return i18n.get("hoursAgo", ago.toHours()); } if (Duration.ofDays(30).compareTo(ago) > 0) { return i18n.get("daysAgo", ago.toDays()); } if (Duration.ofDays(365).compareTo(ago) > 0) { return i18n.get("monthsAgo", ago.toDays() / 30); } return i18n.get("yearsAgo", ago.toDays() / 365); } @Override public String lessThanOneDayAgo(Instant instant) { if (instant == null) { return ""; } Duration ago = Duration.between(instant, Instant.now()); if (ago.compareTo(Duration.ofDays(1)) <= 0) { return timeAgo(instant); } return asDate(instant); } @Override public String asDate(TemporalAccessor temporalAccessor) { return DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT) .withLocale(locale) .withZone(TimeZone.getDefault().toZoneId()) .format(temporalAccessor); } @Override public String asShortTime(Instant instant) { return DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT).withLocale(locale).format( ZonedDateTime.ofInstant(instant, TimeZone.getDefault().toZoneId()) ); } @Override public String shortDuration(Duration duration) { if (duration == null) { return ""; } if (Duration.ofMinutes(1).compareTo(duration) > 0) { return i18n.get("duration.seconds", duration.getSeconds()); } if (Duration.ofHours(1).compareTo(duration) > 0) { return i18n.get("duration.minutesSeconds", duration.toMinutes(), duration.getSeconds()); } return i18n.get("duration.hourMinutes", duration.toMinutes() / 60, duration.toMinutes() % 60); } }