2010-08-30 2 views
0

У меня есть переменная времени аварии в моей базе данных, которая ошибочна, например, время может отображаться как 55, что означает 00:55 или 0, что означает 00:00. Другой может быть 200, что означает 02:00. Он имеет хорошие значения, как и 9:15, которые мне нужно сделать 09:15. Это круглосуточная система часов. Теперь я пишу небольшой частный метод, где мне нужно сравнить время (которое является строкой) и изменить его на правильное. Я использовал .equals, чтобы проверить, равна ли строка 0 и назначил ей 00:00. Мне нужна помощь, чтобы проверить, больше или меньше, чем для строк в Java (пример, если время меньше, чем 10 патч с 0 в передней части), а также как мне изменить с 200 на 02:00. Любая помощь оценивается.сравнение строк в Java

+2

Если вы еще не планировали этого вы должны сделать один раз фиксируем нормализовать все ваши времена, а затем добавьте проверку, чтобы предотвратить то, что не время от попадания в базу данных. Подход, который большинство людей использует, - фактически использовать поле DateTime в БД вместо строки. – Justin

ответ

2

Я не фиксировал бы на equals метод. Вместо этого я бы использовал метод Integer.parseInt, чтобы проверить, является ли значение DB в ошибочном (целочисленном) формате, а затем преобразует это значение в новое «каноническое» представление.

Вот что я имею в виду:

String fixupDbValue(final String dbVal) 
{ 

    final int intVal; 

    try 
    { 
    intVal = Integer.parseInt(dbVal); 
    } 
    catch (NumberFormatException ex) 
    { 
    // Not an int string, canonicalize string value 
    // Check that it's in dd:dd format 
    return fixupStringValue(dbVal); 
    } 

    return fixupIntValue(intVal); 
} 
0
  1. Я бы преобразовать время к военному времени, используя следующий код. Для аргумента прохождения шаблона «yyyy-MM-dd HH: mm: ss».

    общественности статической Дата FormatDate (дата String, String dateFormatPattern) бросает ParseException {

    if(date!=null && dateFormatPattern!=null && dateFormatPattern.trim().length()>0){ 
    
          SimpleDateFormat df = new SimpleDateFormat(dateFormatPattern); 
    
          return df.parse(df.format(date));  
          } 
          return null;  
        } 
    
  2. Затем используйте Date.compareTo() для сравнения дат возвращаемые с помощью форматера.

3

Прежде всего, я настоятельно рекомендую, чтобы изменить столбец БД использовать TIME вместо VARCHAR и написать SQL скрипт для фиксации значений соответственно. Таким образом, вам больше не нужно возиться с ним на стороне Java. Это просто уродливо. Использование правильного типа данных в течение времени предлагает множество преимуществ, вы могли бы легко выбирать/вычислять/манипулировать им с помощью обычных операторов/функций на основе целочисленных чисел в SQL.

Вы можете использовать java.sql.Time (или java.util.Date) объекта для хранения информации о время (PreparedStatement и ResultSet предлагают методы, чтобы установить и получить его в/из БД) и, наконец, просто использовать java.text.SimpleDateFormat для преобразования между читаемой строкой времени человека и объект времени/даты.

Что касается вашего фактический вопрос, что-то, как это должно помочь:

String time = getItSomehow(); 
String paddedTime = String.format("%04d", Integer.valueOf(time)); // Pad with zeros to length of 4. 
String formattedTime = String.format("%s:%s", paddedTime.substring(0, 2), paddedTime.substring(2, 4)); // Format in desired format. 
+0

Я не уверен, что вы имели в виду под «написанием SQL-скрипта для исправления значений соответственно». Я пытался изменить свое время от STRING до TIME, но его не удалось ... Не могли бы вы предложить что-нибудь? – mona

0

Но в первую очередь, вам необходимо преобразовать String в Date. java.text.SimpleDateFormat может помочь.

Анализируя свой алгоритм, я вижу: - если строка состоит из 2-х цифр, вам нужно добавить «00:» в начале - если строка состоит из 3-х цифр, вам нужно добавить «0» в начале и разделить добавить ":" после второй цифры; - если строка содержит ":", мы ничего не делаем.

я вижу что-то вроде этого:

public class Main { 

public static void main(String[] args) throws ParseException { 
    System.out.println(getTime("02")); 
    System.out.println(getTime("200")); 
    System.out.println(getTime("9:15")); 
    System.out.println(getTime("9:")); 
    System.out.println(getTime("55")); 
} 

public static Date getTime(String stringTime) throws ParseException { 
    String correctTimeString; 
    SimpleDateFormat dateFormat = new SimpleDateFormat("hh:mm"); 

    //first of all, converting string to 
    int len = stringTime.length(); 
    if (stringTime.contains(":")) { 

     int index = stringTime.indexOf(":"); 
     if (index == stringTime.length() - 1) { 
      correctTimeString = stringTime + "0"; 
     } else { 
      correctTimeString = stringTime; 
     } 
    } else if (len == 1) { 

     correctTimeString = "00:0" + stringTime; 

    } else if (len == 2) { 

     correctTimeString = "00:" + stringTime;    
    } else if (len == 3) { 

     correctTimeString = "0" + stringTime.charAt(0) + ":" + stringTime.substring(1, stringTime.length()); 
    } else { 
     throw new RuntimeException("Unsupported date format"); 
    } 
    //after convertation, parsing date 
    return dateFormat.parse(correctTimeString); 
} 

}

Вы можете изменить время форматирования или оптимизации строки здание, используя StringBuffer или StringBuilder или вы можете использовать Regex для разбора даты. Думаю, у тебя есть идея. Вы можете исправить код, если я пропустил что-то в алгоритме.

Для сравнения дат используйте java.util.Date.compareTo(Date anotherDate)

Возвраты: значение 0, если аргумент Дата равно этой даты; значение меньше 0, если эта дата предшествует аргументу Date; и значение больше 0, если эта дата после аргумента Date.

0

Это BalusCs код в действии

import java.util.Arrays; 
import java.util.List; 

public class DBTime { 

    final private static List<String> timeStrings = Arrays.asList(
      "55", 
      "0", 
      "200", 
      "915", 
      "00:55", 
      "00:00", 
      "02:00", 
      "09:15"); 

    public static void main(String[] args) { 

     for (String timeString : timeStrings) { 

      System.out.println(convertDbString(timeString)); 

     } 

    } 

    private static String convertDbString(final String dbString) { 

     if (dbString.contains(":")) { //Check if value is corrupted 

      return dbString; 

     } else { 

      String paddedTime = String.format("%04d", Integer.valueOf(dbString)); 

      return String.format("%s:%s", paddedTime.substring(0, 2), paddedTime.substring(2, 4)); 

     } 

    } 
} 

и это выход из этого кода

run: 
00:55 
00:00 
02:00 
09:15 
00:55 
00:00 
02:00 
09:15 
BUILD SUCCESSFUL (total time: 1 second) 
+0

Зачем нужен доступ на уровне пакета 'TimeStrings' (вместо частного)? –

+0

Это личное. Я не вижу причины сделать его закрытым (по умолчанию). Раньше это был пакет? –

Смежные вопросы