public class Chrono {\r
private static final long NUM_100NS_INTERVALS_SINCE_UUID_EPOCH = 0x01b21dd213814000L;\r
\r
- public final static DateFormat dateFmt, dateOnlyFmt, niceDateFmt, utcFmt,iso8601Fmt;\r
- // Give general access to XML DataType Factory, since it's pretty common\r
- public static final DatatypeFactory xmlDatatypeFactory;\r
- \r
- static {\r
- try {\r
- xmlDatatypeFactory = DatatypeFactory.newInstance();\r
- } catch (DatatypeConfigurationException e) {\r
- throw new RuntimeException(e);\r
- }\r
- dateOnlyFmt = new SimpleDateFormat("yyyy-MM-dd");\r
- niceDateFmt = new SimpleDateFormat("yyyy/MM/dd HH:mm zzz");\r
- dateFmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");\r
- utcFmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");\r
- iso8601Fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");\r
- utcFmt.setTimeZone(TimeZone.getTimeZone("UTC"));\r
- }\r
- \r
-\r
- public static class Formatter8601 extends Formatter {\r
-\r
- @Override\r
- public String format(LogRecord r) {\r
- StringBuilder sb = new StringBuilder();\r
- sb.append(dateFmt.format(new Date(r.getMillis())));\r
- sb.append(' ');\r
- sb.append(r.getThreadID());\r
- sb.append(' ');\r
- sb.append(r.getLevel());\r
- sb.append(": ");\r
- sb.append(r.getMessage());\r
- sb.append('\n');\r
- return sb.toString();\r
- }\r
- \r
- }\r
- \r
- /**\r
- * timeStamp\r
- * \r
- * Convenience method to setup an XML dateTime (XMLGregorianCalendar) with "now" \r
- * @return\r
- */\r
- public static XMLGregorianCalendar timeStamp() {\r
- return xmlDatatypeFactory.newXMLGregorianCalendar(new GregorianCalendar());\r
- }\r
-\r
- /**\r
- * timestamp\r
- * \r
- * Convenience method to setup an XML dateTime (XMLGregorianCalendar) with passed in Date \r
- * @param date\r
- * @return\r
- */\r
- public static XMLGregorianCalendar timeStamp(Date date) {\r
- GregorianCalendar gc = new GregorianCalendar();\r
- gc.setTime(date);\r
- return xmlDatatypeFactory.newXMLGregorianCalendar(gc);\r
- }\r
-\r
- public static XMLGregorianCalendar timeStamp(GregorianCalendar gc) {\r
- return xmlDatatypeFactory.newXMLGregorianCalendar(gc);\r
- }\r
-\r
- public static String utcStamp() {\r
- return utcFmt.format(new Date());\r
- }\r
-\r
- public static String utcStamp(Date date) {\r
- if(date==null)return "";\r
- return utcFmt.format(date);\r
- }\r
-\r
- public static String utcStamp(GregorianCalendar gc) {\r
- if(gc==null)return "";\r
- return utcFmt.format(gc.getTime());\r
- }\r
-\r
- public static String utcStamp(XMLGregorianCalendar xgc) {\r
- if(xgc==null)return "";\r
- return utcFmt.format(xgc.toGregorianCalendar().getTime());\r
- }\r
-\r
- public static String dateStamp() {\r
- return dateFmt.format(new Date());\r
- }\r
-\r
- public static String dateStamp(GregorianCalendar gc) {\r
- if(gc == null)return "";\r
- return dateFmt.format(gc.getTime());\r
- }\r
-\r
- public static String dateStamp(Date date) {\r
- if(date == null)return "";\r
- return dateFmt.format(date);\r
- }\r
-\r
- public static String dateStamp(XMLGregorianCalendar xgc) {\r
- if(xgc==null)return "";\r
- return dateFmt.format(xgc.toGregorianCalendar().getTime());\r
- }\r
-\r
- /**\r
- * JAXB compatible dataTime Stamp\r
- * \r
- * Java 6 does not format Timezone with -05:00 format, and JAXB XML breaks without it.\r
- * \r
- * @return\r
- */\r
- public static String dateTime() {\r
- return dateTime(new GregorianCalendar());\r
- }\r
-\r
- /**\r
- * JAXB compatible dataTime Stamp\r
- * \r
- * Java 6 does not format Timezone with -05:00 format, and JAXB XML breaks without it.\r
- * \r
- * @return\r
- */\r
- public static String dateTime(Date date) {\r
- GregorianCalendar gc = new GregorianCalendar();\r
- gc.setTime(date);\r
- return dateTime(gc);\r
- }\r
-\r
- /**\r
- * JAXB compatible dataTime Stamp\r
- * \r
- * Java 6 does not format Timezone with -05:00 format, and JAXB XML breaks without it.\r
- * \r
- * @return\r
- */\r
- public static String dateTime(GregorianCalendar gc) {\r
- if(gc == null)return "";\r
- TimeZone tz = gc.getTimeZone();\r
- int tz1 = (tz.getRawOffset()+tz.getDSTSavings())/0x8CA0;\r
- int tz1abs = Math.abs(tz1);\r
- return String.format("%04d-%02d-%02dT%02d:%02d:%02d.%03d%c%02d:%02d", \r
- gc.get(GregorianCalendar.YEAR),\r
- gc.get(GregorianCalendar.MONTH)+1,\r
- gc.get(GregorianCalendar.DAY_OF_MONTH),\r
- gc.get(GregorianCalendar.HOUR),\r
- gc.get(GregorianCalendar.MINUTE),\r
- gc.get(GregorianCalendar.SECOND),\r
- gc.get(GregorianCalendar.MILLISECOND),\r
- tz1==tz1abs?'+':'-',\r
- tz1abs/100,\r
- ((tz1abs-(tz1abs/100)*100)*6)/10 // Get the "10s", then convert to mins (without losing int place)\r
- );\r
- }\r
-\r
- /**\r
- * JAXB compatible dataTime Stamp\r
- * \r
- * Java 6 does not format Timezone with -05:00 format, and JAXB XML breaks without it.\r
- * \r
- * @return\r
- */\r
- public static String dateTime(XMLGregorianCalendar xgc) {\r
- return xgc==null?"":dateTime(xgc.toGregorianCalendar());\r
- }\r
-\r
- public static String dateOnlyStamp() {\r
- return dateOnlyFmt.format(new Date());\r
- }\r
-\r
- public static String dateOnlyStamp(GregorianCalendar gc) {\r
- return gc == null?"":dateOnlyFmt.format(gc.getTime());\r
- }\r
-\r
- public static String dateOnlyStamp(Date date) {\r
- return date == null?"":dateOnlyFmt.format(date);\r
- }\r
-\r
- public static String dateOnlyStamp(XMLGregorianCalendar xgc) {\r
- return xgc==null?"":dateOnlyFmt.format(xgc.toGregorianCalendar().getTime());\r
- }\r
-\r
- public static String niceDateStamp() {\r
- return niceDateFmt.format(new Date());\r
- }\r
-\r
- public static String niceDateStamp(Date date) {\r
- return date==null?"":niceDateFmt.format(date);\r
- }\r
-\r
- public static String niceDateStamp(GregorianCalendar gc) {\r
- return gc==null?"":niceDateFmt.format(gc.getTime());\r
- }\r
-\r
- public static String niceDateStamp(XMLGregorianCalendar xgc) {\r
- return xgc==null?"":niceDateFmt.format(xgc.toGregorianCalendar().getTime());\r
- }\r
-\r
-\r
- ////////////////////// HELPFUL Strings\r
- public static final String BAD_DIR_CHARS_REGEX = "[/:\\;.]";\r
- public static final String SPLIT_DIR_REGEX = "/";\r
-\r
- public static long firstMomentOfDay(long utc) {\r
- GregorianCalendar begin = new GregorianCalendar();\r
- begin.setTimeInMillis(utc);\r
- return firstMomentOfDay(begin).getTimeInMillis();\r
- } \r
- \r
- public static long lastMomentOfDay(long utc) {\r
- GregorianCalendar end = new GregorianCalendar();\r
- end.setTimeInMillis(utc);\r
- return lastMomentOfDay(end).getTimeInMillis();\r
- }\r
-\r
- public static GregorianCalendar firstMomentOfDay(GregorianCalendar begin) {\r
- if(begin==null)begin = new GregorianCalendar();\r
- begin.set(GregorianCalendar.HOUR, 0);\r
- begin.set(GregorianCalendar.AM_PM, GregorianCalendar.AM);\r
- begin.set(GregorianCalendar.MINUTE, 0);\r
- begin.set(GregorianCalendar.SECOND, 0);\r
- begin.set(GregorianCalendar.MILLISECOND, 0);\r
- return begin;\r
- } \r
-\r
- public static GregorianCalendar lastMomentOfDay(GregorianCalendar end) {\r
- if(end==null)end = new GregorianCalendar();\r
- end.set(GregorianCalendar.HOUR, 11);\r
- end.set(GregorianCalendar.MINUTE, 59);\r
- end.set(GregorianCalendar.SECOND, 59);\r
- end.set(GregorianCalendar.MILLISECOND, 999);\r
- end.set(GregorianCalendar.AM_PM, GregorianCalendar.PM);\r
- return end;\r
- }\r
-\r
- // UUID needs to be converted from UUID Epoch\r
- public static final Date uuidToDate(UUID id) {\r
- return new Date((id.timestamp() - NUM_100NS_INTERVALS_SINCE_UUID_EPOCH)/10000);\r
- }\r
-\r
- public static final long uuidToUnix(UUID id) {\r
- return (id.timestamp() - NUM_100NS_INTERVALS_SINCE_UUID_EPOCH)/10000;\r
- }\r
-\r
- public static float millisFromNanos(long start, long end) {\r
- return (end - start) / 1000000f;\r
- }\r
-\r
-\r
- private static long sequence = new SecureRandom().nextInt();\r
- private static synchronized long sequence() {\r
- return ++sequence;\r
- }\r
- \r
- public static final UUID dateToUUID(Date origTime) {\r
- return dateToUUID(origTime.getTime());\r
- }\r
- \r
- public static final UUID dateToUUID(long origTime) {\r
- /*\r
- * From Cassandra : http://wiki.apache.org/cassandra/FAQ\r
- Magic number obtained from #cassandra's thobbs, who\r
- claims to have stolen it from a Python library.\r
- */\r
+ public final static DateFormat dateFmt, dateOnlyFmt, niceDateFmt, utcFmt,iso8601Fmt;\r
+ // Give general access to XML DataType Factory, since it's pretty common\r
+ public static final DatatypeFactory xmlDatatypeFactory;\r
+ \r
+ static {\r
+ try {\r
+ xmlDatatypeFactory = DatatypeFactory.newInstance();\r
+ } catch (DatatypeConfigurationException e) {\r
+ throw new RuntimeException(e);\r
+ }\r
+ dateOnlyFmt = new SimpleDateFormat("yyyy-MM-dd");\r
+ niceDateFmt = new SimpleDateFormat("yyyy/MM/dd HH:mm zzz");\r
+ dateFmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");\r
+ utcFmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");\r
+ iso8601Fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");\r
+ utcFmt.setTimeZone(TimeZone.getTimeZone("UTC"));\r
+ }\r
+ \r
+\r
+ public static class Formatter8601 extends Formatter {\r
+\r
+ @Override\r
+ public String format(LogRecord r) {\r
+ StringBuilder sb = new StringBuilder();\r
+ sb.append(dateFmt.format(new Date(r.getMillis())));\r
+ sb.append(' ');\r
+ sb.append(r.getThreadID());\r
+ sb.append(' ');\r
+ sb.append(r.getLevel());\r
+ sb.append(": ");\r
+ sb.append(r.getMessage());\r
+ sb.append('\n');\r
+ return sb.toString();\r
+ }\r
+ \r
+ }\r
+ \r
+ /**\r
+ * timeStamp\r
+ * \r
+ * Convenience method to setup an XML dateTime (XMLGregorianCalendar) with "now" \r
+ * @return\r
+ */\r
+ public static XMLGregorianCalendar timeStamp() {\r
+ return xmlDatatypeFactory.newXMLGregorianCalendar(new GregorianCalendar());\r
+ }\r
+\r
+ /**\r
+ * timestamp\r
+ * \r
+ * Convenience method to setup an XML dateTime (XMLGregorianCalendar) with passed in Date \r
+ * @param date\r
+ * @return\r
+ */\r
+ public static XMLGregorianCalendar timeStamp(Date date) {\r
+ GregorianCalendar gc = new GregorianCalendar();\r
+ gc.setTime(date);\r
+ return xmlDatatypeFactory.newXMLGregorianCalendar(gc);\r
+ }\r
+\r
+ public static XMLGregorianCalendar timeStamp(GregorianCalendar gc) {\r
+ return xmlDatatypeFactory.newXMLGregorianCalendar(gc);\r
+ }\r
+\r
+ public static String utcStamp() {\r
+ return utcFmt.format(new Date());\r
+ }\r
+\r
+ public static String utcStamp(Date date) {\r
+ if (date==null)return "";\r
+ return utcFmt.format(date);\r
+ }\r
+\r
+ public static String utcStamp(GregorianCalendar gc) {\r
+ if (gc==null)return "";\r
+ return utcFmt.format(gc.getTime());\r
+ }\r
+\r
+ public static String utcStamp(XMLGregorianCalendar xgc) {\r
+ if (xgc==null)return "";\r
+ return utcFmt.format(xgc.toGregorianCalendar().getTime());\r
+ }\r
+\r
+ public static String dateStamp() {\r
+ return dateFmt.format(new Date());\r
+ }\r
+\r
+ public static String dateStamp(GregorianCalendar gc) {\r
+ if (gc == null)return "";\r
+ return dateFmt.format(gc.getTime());\r
+ }\r
+\r
+ public static String dateStamp(Date date) {\r
+ if (date == null)return "";\r
+ return dateFmt.format(date);\r
+ }\r
+\r
+ public static String dateStamp(XMLGregorianCalendar xgc) {\r
+ if (xgc==null)return "";\r
+ return dateFmt.format(xgc.toGregorianCalendar().getTime());\r
+ }\r
+\r
+ /**\r
+ * JAXB compatible dataTime Stamp\r
+ * \r
+ * Java 6 does not format Timezone with -05:00 format, and JAXB XML breaks without it.\r
+ * \r
+ * @return\r
+ */\r
+ public static String dateTime() {\r
+ return dateTime(new GregorianCalendar());\r
+ }\r
+\r
+ /**\r
+ * JAXB compatible dataTime Stamp\r
+ * \r
+ * Java 6 does not format Timezone with -05:00 format, and JAXB XML breaks without it.\r
+ * \r
+ * @return\r
+ */\r
+ public static String dateTime(Date date) {\r
+ GregorianCalendar gc = new GregorianCalendar();\r
+ gc.setTime(date);\r
+ return dateTime(gc);\r
+ }\r
+\r
+ /**\r
+ * JAXB compatible dataTime Stamp\r
+ * \r
+ * Java 6 does not format Timezone with -05:00 format, and JAXB XML breaks without it.\r
+ * \r
+ * @return\r
+ */\r
+ public static String dateTime(GregorianCalendar gc) {\r
+ if (gc == null)return "";\r
+ TimeZone tz = gc.getTimeZone();\r
+ int tz1 = (tz.getRawOffset()+tz.getDSTSavings())/0x8CA0;\r
+ int tz1abs = Math.abs(tz1);\r
+ return String.format("%04d-%02d-%02dT%02d:%02d:%02d.%03d%c%02d:%02d", \r
+ gc.get(GregorianCalendar.YEAR),\r
+ gc.get(GregorianCalendar.MONTH)+1,\r
+ gc.get(GregorianCalendar.DAY_OF_MONTH),\r
+ gc.get(GregorianCalendar.HOUR),\r
+ gc.get(GregorianCalendar.MINUTE),\r
+ gc.get(GregorianCalendar.SECOND),\r
+ gc.get(GregorianCalendar.MILLISECOND),\r
+ tz1==tz1abs?'+':'-',\r
+ tz1abs/100,\r
+ ((tz1abs-(tz1abs/100)*100)*6)/10 // Get the "10s", then convert to mins (without losing int place)\r
+ );\r
+ }\r
+\r
+ /**\r
+ * JAXB compatible dataTime Stamp\r
+ * \r
+ * Java 6 does not format Timezone with -05:00 format, and JAXB XML breaks without it.\r
+ * \r
+ * @return\r
+ */\r
+ public static String dateTime(XMLGregorianCalendar xgc) {\r
+ return xgc==null?"":dateTime(xgc.toGregorianCalendar());\r
+ }\r
+\r
+ public static String dateOnlyStamp() {\r
+ return dateOnlyFmt.format(new Date());\r
+ }\r
+\r
+ public static String dateOnlyStamp(GregorianCalendar gc) {\r
+ return gc == null?"":dateOnlyFmt.format(gc.getTime());\r
+ }\r
+\r
+ public static String dateOnlyStamp(Date date) {\r
+ return date == null?"":dateOnlyFmt.format(date);\r
+ }\r
+\r
+ public static String dateOnlyStamp(XMLGregorianCalendar xgc) {\r
+ return xgc==null?"":dateOnlyFmt.format(xgc.toGregorianCalendar().getTime());\r
+ }\r
+\r
+ public static String niceDateStamp() {\r
+ return niceDateFmt.format(new Date());\r
+ }\r
+\r
+ public static String niceDateStamp(Date date) {\r
+ return date==null?"":niceDateFmt.format(date);\r
+ }\r
+\r
+ public static String niceDateStamp(GregorianCalendar gc) {\r
+ return gc==null?"":niceDateFmt.format(gc.getTime());\r
+ }\r
+\r
+ public static String niceDateStamp(XMLGregorianCalendar xgc) {\r
+ return xgc==null?"":niceDateFmt.format(xgc.toGregorianCalendar().getTime());\r
+ }\r
+\r
+\r
+ ////////////////////// HELPFUL Strings\r
+ public static final String BAD_DIR_CHARS_REGEX = "[/:\\;.]";\r
+ public static final String SPLIT_DIR_REGEX = "/";\r
+\r
+ public static long firstMomentOfDay(long utc) {\r
+ GregorianCalendar begin = new GregorianCalendar();\r
+ begin.setTimeInMillis(utc);\r
+ return firstMomentOfDay(begin).getTimeInMillis();\r
+ } \r
+ \r
+ public static long lastMomentOfDay(long utc) {\r
+ GregorianCalendar end = new GregorianCalendar();\r
+ end.setTimeInMillis(utc);\r
+ return lastMomentOfDay(end).getTimeInMillis();\r
+ }\r
+\r
+ public static GregorianCalendar firstMomentOfDay(GregorianCalendar begin) {\r
+ if (begin==null)begin = new GregorianCalendar();\r
+ begin.set(GregorianCalendar.HOUR, 0);\r
+ begin.set(GregorianCalendar.AM_PM, GregorianCalendar.AM);\r
+ begin.set(GregorianCalendar.MINUTE, 0);\r
+ begin.set(GregorianCalendar.SECOND, 0);\r
+ begin.set(GregorianCalendar.MILLISECOND, 0);\r
+ return begin;\r
+ } \r
+\r
+ public static GregorianCalendar lastMomentOfDay(GregorianCalendar end) {\r
+ if (end==null)end = new GregorianCalendar();\r
+ end.set(GregorianCalendar.HOUR, 11);\r
+ end.set(GregorianCalendar.MINUTE, 59);\r
+ end.set(GregorianCalendar.SECOND, 59);\r
+ end.set(GregorianCalendar.MILLISECOND, 999);\r
+ end.set(GregorianCalendar.AM_PM, GregorianCalendar.PM);\r
+ return end;\r
+ }\r
+\r
+ // UUID needs to be converted from UUID Epoch\r
+ public static final Date uuidToDate(UUID id) {\r
+ return new Date((id.timestamp() - NUM_100NS_INTERVALS_SINCE_UUID_EPOCH)/10000);\r
+ }\r
+\r
+ public static final long uuidToUnix(UUID id) {\r
+ return (id.timestamp() - NUM_100NS_INTERVALS_SINCE_UUID_EPOCH)/10000;\r
+ }\r
+\r
+ public static float millisFromNanos(long start, long end) {\r
+ return (end - start) / 1000000f;\r
+ }\r
+\r
+\r
+ private static long sequence = new SecureRandom().nextInt();\r
+ private static synchronized long sequence() {\r
+ return ++sequence;\r
+ }\r
+ \r
+ public static final UUID dateToUUID(Date origTime) {\r
+ return dateToUUID(origTime.getTime());\r
+ }\r
+ \r
+ public static final UUID dateToUUID(long origTime) {\r
+ /*\r
+ * From Cassandra : http://wiki.apache.org/cassandra/FAQ\r
+ Magic number obtained from #cassandra's thobbs, who\r
+ claims to have stolen it from a Python library.\r
+ */\r
long time = origTime * 10000 + NUM_100NS_INTERVALS_SINCE_UUID_EPOCH;\r
long timeLow = time & 0xffffffffL;\r
long timeMid = time & 0xffff00000000L;\r
long timeHi = time & 0xfff000000000000L;\r
long upperLong = (timeLow << 32) | (timeMid >> 16) | (1 << 12) | (timeHi >> 48) ;\r
return new java.util.UUID(upperLong, (0xC000000000000000L | sequence()));\r
- }\r
+ }\r
\r
}\r