// Vikunja is a to-do list application to facilitate your life. // Copyright 2018-present Vikunja and contributors. All rights reserved. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public Licensee as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public Licensee for more details. // // You should have received a copy of the GNU Affero General Public Licensee // along with this program. If not, see . package utils import ( "fmt" "math" "strings" "time" "code.vikunja.io/api/pkg/i18n" ) // HumanizeDuration formats a time.Duration in a human-friendly format. // Based on https://gist.github.com/harshavardhana/327e0577c4fed9211f65 func HumanizeDuration(duration time.Duration, lang string) string { years := int64(duration.Hours() / 24 / 365) days := int64(duration.Hours()/24) - years*365 weeks := days / 7 days -= weeks * 7 hours := int64(math.Mod(duration.Hours(), 24)) minutes := int64(math.Mod(duration.Minutes(), 60)) chunks := []struct { singularKey string pluralKey string amount int64 }{ {"time.year", "time.years", years}, {"time.week", "time.weeks", weeks}, {"time.day", "time.days", days}, {"time.hour", "time.hours", hours}, {"time.minute", "time.minutes", minutes}, } parts := []string{} for _, chunk := range chunks { switch chunk.amount { case 0: continue case 1: parts = append(parts, fmt.Sprintf(i18n.T(lang, "time.one_unit_format"), i18n.T(lang, chunk.singularKey))) default: parts = append(parts, fmt.Sprintf(i18n.T(lang, "time.multiple_units_format"), chunk.amount, i18n.T(lang, chunk.pluralKey))) // i18n.T(lang, "time.multiple_units_format", // strconv.FormatInt(chunk.amount, 10), i18n.T(lang, chunk.pluralKey)) } } if len(parts) > 1 { return strings.Join(parts[:len(parts)-1], ", ") + i18n.T(lang, "time.list_last_separator") + parts[len(parts)-1] } return strings.Join(parts, ", ") }