将4位军事时间转换为标准的12小时时间格式

时间:2013-12-03 03:56:48

标签: java datetime time formatting

我正在尝试做什么:

我正在尝试将4位数的军事时间转换为标准的12小时时间格式,使用冒号和添加的PM或AM,而无需在我的代码之前导入任何内容(我正在制作一个需要的方法除了java 101技术之外别无其他。)

我的情况:

我有 milTime ,我每次运行时都会手动改变它(如声明最高,目前为1100),直到我将其转换为方法并提交它将采用milTime的赋值,并将返回milTimeString以供主程序打印。我目前正在使用BlueJ作为IDE,(我不确定这是否是最好用的?)

输入和输出示例:

如果给出了0056,我必须在上午12:56返回。 如果给出1125,我将不得不在上午11:25返回。 如果给出2359,我将不得不在晚上11:59返回。

我需要帮助的问题

  1. 当我执行时,无论是输入11:24还是23:24,我的am / pm布尔值都会在某处失败,它总是输出pm。
  2. 很明显我工作太难以产生输出,但我不知道一种更简单的方法(除了导入一些东西 for 我,我不想要做)。
  3. 我谦卑地接受任何批评我臃肿的当前代码,以及我冗长的请求中的任何更正。我四处寻找替代答案,一切都涉及到我之外的进口或知识。感谢您的时间到目前为止,并提前感谢所有人。

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

4 个答案:

答案 0 :(得分:6)

你的问题是尖叫,你应该使用自己的自定义数据格式化程序。我喜欢使用Joda Time library及其 DateTime 类而不是内置的Java Date Calendar 类。因此,我建议您使用DateTimeFormat创建DateTimeFormatter,而不是 SimpleDateFormat ,然后您可以使用该字符串将字符串转换为DateTime。每个输入和输出都需要一个DateTimeFormatter。例如:

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;

试试这个!

答案 1 :(得分:5)

使用聪明的字符串转换和SimpleDateFormat,您可以做得更多,更简单,这是示例,但分为两行:

// 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

答案 2 :(得分:4)

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

单个等号是一项任务。你想做一个比较:

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

这些也可以更加惯用地写成:

if (pm)
if (!pm)

这是主要问题。另一个是你设置pm的逻辑。您只需要一个if语句,并在pm = true块中放置减去1200的行。

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

我还会留下一些其他错误。我相信这些更正会让你更进一步,至少。

答案 3 :(得分:1)

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