return null;
}
}
+
+ /**
+ * Given a format ID and its format String, will check to see if the
+ * format represents a date format or not.
+ * Firstly, it will check to see if the format ID corresponds to an
+ * internal excel date format (eg most US date formats)
+ * If not, it will check to see if the format string only contains
+ * date formatting characters (ymd-/), which covers most
+ * non US date formats.
+ *
+ * @param formatIndex The index of the format, eg from ExtendedFormatRecord.getFormatIndex
+ * @param formatString The format string
+ */
+ public static boolean isADateFormat(int formatIndex, String formatString) {
+ // First up, is this an internal date format?
+ if(isInternalDateFormat(formatIndex)) {
+ return true;
+ }
+
+ // If we didn't get a real string, it can't be
+ if(formatString == null || formatString.length() == 0) {
+ return false;
+ }
+
+ // Translate \- into just -, before matching
+ String fs = formatString.replace("\\-","-");
+
+ // Otherwise, check it's only made up of:
+ // y m d - /
+ if(fs.matches("^[ymd\\-/]+$")) {
+ return true;
+ }
+
+ return false;
+ }
/**
- * given a format ID this will check whether the format represents
- * an internal date format or not.
+ * Given a format ID this will check whether the format represents
+ * an internal excel date format or not.
+ * @see isDateFormat(int,String)
*/
public static boolean isInternalDateFormat(int format) {
boolean retval =false;
HSSFDateUtil.getExcelDate(javaDate), oneMinute);
}
}
+
+ /**
+ * Tests that we correctly detect date formats as such
+ */
+ public void testIdentifyDateFormats() {
+ // First up, try with a few built in date formats
+ short[] builtins = new short[] { 0x0e, 0x0f, 0x10, 0x16, 0x2d, 0x2e };
+ for(int i=0; i<builtins.length; i++) {
+ String formatStr = HSSFDataFormat.getBuiltinFormat(builtins[i]);
+ assertTrue( HSSFDateUtil.isInternalDateFormat(builtins[i]) );
+ assertTrue( HSSFDateUtil.isADateFormat(builtins[i],formatStr) );
+ }
+
+ // Now try a few built-in non date formats
+ builtins = new short[] { 0x01, 0x02, 0x17, 0x1f, 0x30 };
+ for(int i=0; i<builtins.length; i++) {
+ String formatStr = HSSFDataFormat.getBuiltinFormat(builtins[i]);
+ assertFalse( HSSFDateUtil.isInternalDateFormat(builtins[i]) );
+ assertFalse( HSSFDateUtil.isADateFormat(builtins[i],formatStr) );
+ }
+
+ // Now for some non-internal ones
+ // These come after the real ones
+ int numBuiltins = HSSFDataFormat.getNumberOfBuiltinBuiltinFormats();
+ assertTrue(numBuiltins < 60);
+ short formatId = 60;
+ assertFalse( HSSFDateUtil.isInternalDateFormat(formatId) );
+
+ // Valid ones first
+ String[] formats = new String[] {
+ "yyyy-mm-dd", "yyyy/mm/dd", "yy/mm/dd", "yy/mmm/dd",
+ "dd/mm/yy", "dd/mm/yyyy", "dd/mmm/yy",
+ "dd-mm-yy", "dd-mm-yyyy",
+ "dd\\-mm\\-yy", // Sometimes escaped
+ };
+ for(int i=0; i<formats.length; i++) {
+ assertTrue( HSSFDateUtil.isADateFormat(formatId, formats[i]) );
+ }
+
+ // Then invalid ones
+ formats = new String[] {
+ "yyyy:mm:dd",
+ "0.0", "0.000",
+ "0%", "0.0%",
+ "", null
+ };
+ for(int i=0; i<formats.length; i++) {
+ assertFalse( HSSFDateUtil.isADateFormat(formatId, formats[i]) );
+ }
+ }
public static void main(String [] args) {
System.out