001package co.codewizards.cloudstore.core; 002 003import java.util.ArrayList; 004import java.util.Arrays; 005import java.util.Collections; 006import java.util.List; 007import java.util.ListIterator; 008 009/** 010 * Units based on <a target="_blank" href="http://en.wikipedia.org/wiki/ISO_31-1">ISO 31-1</a> (where it exists). 011 * 012 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de 013 */ 014public enum TimeUnit { 015 /** 016 * Millisecond. 017 */ 018 ms("Millisecond", 1L), 019 020 /** 021 * Second. 022 */ 023 s("Second", 1000L), 024 025 /** 026 * Minute. 027 */ 028 min("Minute", 60L * s.msec), 029 030 /** 031 * Hour. 032 */ 033 h("Hour", 60L * min.msec), 034 035 /** 036 * Day. 037 */ 038 d("Day", 24L * h.msec), 039 040 /** 041 * Year. <a target="_blank" href="http://en.wikipedia.org/wiki/Year">Abbreviation from latin "annus".</a> 042 */ 043 a("Year", 365L * d.msec), 044 045 /** 046 * Year (alternative for convenience). 047 */ 048 y("Year", 365L * d.msec) 049 ; 050 051 private final String displayName; 052 private final long msec; 053 054 private TimeUnit(String displayName, long msec) 055 { 056 this.displayName = displayName; 057 this.msec = msec; 058 } 059 060 public long toMillis(long value) 061 { 062 return value * msec; 063 } 064 065 public long toMillis() 066 { 067 return msec; 068 } 069 070 public String getDisplayName() { 071 return displayName; 072 } 073 074 public static String getAllUnitsWithDisplayName() 075 { 076 return getAllUnitsWithDisplayName(", "); 077 } 078 079 public static String getAllUnitsWithDisplayName(String separator) 080 { 081 return getAllUnitsWithDisplayName("%s (%s)", separator); 082 } 083 084 public static String getAllUnitsWithDisplayName(String unitFormat, String separator) 085 { 086 StringBuilder sb = new StringBuilder(); 087 088 for (TimeUnit u : values()) { 089 if (sb.length() > 0) 090 sb.append(separator); 091 092 sb.append(String.format(unitFormat, u.name(), u.getDisplayName())); 093 } 094 095 return sb.toString(); 096 } 097 098 public static List<TimeUnit> getUniqueTimeUnitsOrderedByLengthAsc() { 099 final List<TimeUnit> result = new ArrayList<>(Arrays.asList(TimeUnit.values())); 100 result.remove(TimeUnit.y); // "y" is redundant - using only "a" by default. 101 return Collections.unmodifiableList(result); 102 } 103 104 public static List<TimeUnit> getUniqueTimeUnitsOrderedByLengthDesc() { 105 final List<TimeUnit> asc = getUniqueTimeUnitsOrderedByLengthAsc(); 106 final List<TimeUnit> desc = new ArrayList<TimeUnit>(asc.size()); 107 for (final ListIterator<TimeUnit> it = asc.listIterator(asc.size()); it.hasPrevious();) { 108 final TimeUnit timeUnit = it.previous(); 109 desc.add(timeUnit); 110 } 111 return desc; 112 } 113}