0

I have an accident time variable in my database which is erroneous, for example the time could show up as 55 which means 00:55 or 0 which means 00:00. Another one could be 200 which means 02:00. It has good values as well like 9:15 which I need to make 09:15. It is a 24 hour clock system. Now I am writing a small private method where I need to compare the time(which is a string) and change it to the proper one. I have used .equals to check and see if the string is equal to 0 and assigned it 00:00. I need help to check the greater than or less than for strings in Java(example if time is less than 10 patch it with 0 in the front) and also how do I change 200 to 02:00. Any help appreciated.

1
  • 2
    If you have not already planned on this you should do a one time fix to normalize all your times, then add validation to prevent things which are not times from getting into the database. The approach most people take is to actually use a DateTime field in the DB instead of a string. Commented Aug 30, 2010 at 19:56

5 Answers 5

3

First of all, I strongly recommend to change your DB column to use TIME instead of VARCHAR and write a SQL script to fix the values accordingly. This way you don't need to fiddle it in the Java side anymore. This is plain ugly. Using the right datatype for the time offers lot of advantages, you could select/calculate/manipulate it much easier using the usual integer-based operators/functions in SQL.

You could use java.sql.Time (or java.util.Date) object to hold the time information (the PreparedStatement and ResultSet offers methods to set and get it in/from the DB) and finally just use java.text.SimpleDateFormat to convert between the human readable time string and the time/date object.

As to your actual question, something like this should help:

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.
Sign up to request clarification or add additional context in comments.

1 Comment

I am not sure what you meant by 'write a SQL script to fix the values accordingly'. I tried to change my time from STRING to TIME but its not working out...Could you please suggest anything?
2

I would not fixate on equals method. Instead I would use Integer.parseInt method to check whether the DB value is in erroneous (integer) format, then convert that int value to a new 'canonical' representation.

Here is what I mean:

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 );
}

Comments

0
  1. I would convert the time to military time using the following code. For the pattern pass argument "yyyy-MM-dd HH:mm:ss".

    public static Date formatDate(String date,String dateFormatPattern) throws ParseException {

        if(date!=null && dateFormatPattern!=null && dateFormatPattern.trim().length()>0){
    
              SimpleDateFormat df = new SimpleDateFormat(dateFormatPattern);
    
              return df.parse(df.format(date));       
              }  
                return null;    
      }  
    
  2. Then use Date.compareTo() to compare the dates returned using the formatter.

Comments

0

But first of all, you'll need to transform String to Date. java.text.SimpleDateFormat can help.

Analyzing your algorithm, I see: - if string consist of 2 digits, you need to append "00:" at the start - if string consist of 3 digits, you need to append "0" at the start and split add ":" after second digit; - if string contains ":" we do nothing.

I see something like this:

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);
}

}

You can change time formatting or optimize string building using StringBuffer or StringBuilder or you can use Regex for parsing dates. I think you got the idea. You can correct the code, if I missed something in algorithm.

For comparing Dates use java.util.Date.compareTo(Date anotherDate)

Returns: the value 0 if the argument Date is equal to this Date; a value less than 0 if this Date is before the Date argument; and a value greater than 0 if this Date is after the Date argument.

Comments

0

This is BalusCs code in action

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));

        }

    }
}

and this is the output of this code

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

2 Comments

Why is timeStrings package level access (instead of private)?
It is private. I don't see a reason to make it package private (default). Was it package private before?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.