convert a 4-digit military time into the standard

2020-02-11 05:23发布

问题:

What I'm trying to do:

I'm trying to convert a 4-digit military time into the standard 12 hour time format, with a colon and an added PM or AM without the use of importing anything before my code (I'm making a method that requires nothing other than java 101 techniques).

My situation:

I have milTime, which I manually change around for now every time I run it(as declared up top, currently at 1100), until I convert it into a method and submit the assignment, in which it will take in milTime, and will return milTimeString for the main program to print. I'm currently using BlueJ as an IDE, (I'm not sure if that's the best one to use?)

Example of input and output:

If 0056 were given, I would have to return 12:56am. If 1125 were given, I would have to return 11:25am. If 2359 were given, I would have to return 11:59pm.

Issues I need help with

  1. When I execute, my am / pm boolean fails somewhere and it always outputs pm, no matter if I input 11:24 or 23:24.
  2. It's probably obvious I'm working too hard to generate the output, but I don't know an easier way (Other than importing something to do it for me, which I don't want to do).

I humbly submit to any criticism on my bloated current code, and any corrections in my long-winded request. I've looked around for alternate answers, and everything involved importing or knowledge beyond me. Thanks for your time so far, and thanks in advance everyone.

public class timeTest
{
    public static void main(String []args)
    {   
        /*Declare my variables*/
        int milTime = 2400;
        String timeString = "";
        boolean pm;

        /*determine AM or PM and convert over 1200 into a clock's digits */
        if (milTime >1259)
        {
            if (milTime <1200)
            {
                pm = false;
            }
            else
            {
                pm = true;
            }
            milTime = (milTime - 1200);
        }
        else
        {
        }

        /*figure out my digits*/
        int fourthDigit = milTime%10;
        milTime = milTime/10;
        int thirdDigit = milTime%10;
        milTime = milTime/10;
        int secondDigit = milTime%10;
        milTime = milTime/10;
        int firstDigit = milTime%10;

        /*build each side of the colon*/
        String hoursString = thirdDigit + "" + fourthDigit;
        String minutesString = firstDigit + "" + secondDigit;

        /*determine if the first digit is zero and if so, omit it*/
        if (firstDigit == 0 )
        {
            minutesString = "" + secondDigit;
        }
        else
        {
        }
        if (secondDigit == 0)
        {
            minutesString = "12";
        }
        else
        {
        }

        /*build the total string and return the result with AM or PM based on conditional boolean.*/
        if (pm = true)
        {
            timeString = (minutesString + ':' + hoursString + "pm");
        }
        else
        {
        }

        if (pm = false)
        {
            timeString = (minutesString + ':' + hoursString + "am");
        }
        else
        {
        }
        System.out.println(timeString);

    }
}

回答1:

Your problem is screaming out that you should be using your own custom data formatter. I like using the Joda Time library and its DateTime class instead of the built-in Java Date and Calendar classes. Therefore, instead of SimpleDateFormat, I recommend that you use a DateTimeFormat to create a DateTimeFormatter, which you will then use to convert your String into a DateTime. You will need one DateTimeFormatter for each of input and output. For example:

String rawTimestamp = "2300"; // For example
DateTimeFormatter inputFormatter = DateTimeFormat.forPattern("HHmm");
DateTimeFormatter outputFormatter = DateTimeFormat.forPattern("hh:mm a");
DateTime dateTime = inputFormatter.parseDateTime(rawTimestamp);
String formattedTimestamp = outputFormatter.print(dateTime.getMillis());
return formattedTimestamp;

Try this out!



回答2:

You can do this much, much simpler, using a clever string conversion and SimpleDateFormat, here is the example but parsed in two lines:

// Heres your military time int like in your code sample
int milTime = 56;
// Convert the int to a string ensuring its 4 characters wide, parse as a date 
Date date = new SimpleDateFormat("hhmm").parse(String.format("%04d", milTime));
// Set format: print the hours and minutes of the date, with AM or PM at the end 
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a");
// Print the date!
System.out.println(sdf.format(date));
// Output: 12:56 AM


回答3:

if (pm = true)
if (pm = false)

A single equal sign is an assignment. You want to do a comparison:

if (pm == true)
if (pm == false)

These could also be written more idiomatically as:

if (pm)
if (!pm)

That's the main problem. Another is your logic for setting pm. You only need a single if statement, with the line subtracting 1200 placed inside the pm = true block.

if (milTime < 1200)
{
    pm = false;
}
else
{
    pm = true;
    milTime -= 1200;
}

There are a few other bugs that I'll leave to you. I trust these corrections will get you a bit further, at least.



回答4:

public static String convert24HourToAmPm(String time) {

    if (time == null)
        return time;

    // Convert time where time is like: 0100, 0200, 0300....2300...
    if (time.length() == 4 && Helper.isInteger(time)) {
        String hour = time.substring(0,2);
        String minutes = time.substring(2,4);
        String meridian = "am";

        if (hour.substring(0,2).equals("00")) {
            hour = "12";
        } else if (hour.substring(0,1).equals("1") || hour.substring(0,1).equals("2")) {
            meridian = "pm";
            Integer militaryHour = Integer.parseInt(hour);
            Integer convertedHour = null;

            if (militaryHour > 12) {
                convertedHour = (militaryHour - 12);

                if (convertedHour < 10)
                    hour = "0" + String.valueOf(convertedHour);
                else
                    hour = String.valueOf(convertedHour);
            }
        }

        time = hour + ":" + minutes + " " + meridian;
    }

    // TODO - Convert time where time is like 01:00...23:00...

    return time;
}