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

Java 将4位数的军用时间转换为标准的12小时时间格式,java,datetime,time,formatting,Java,Datetime,Time,Formatting,我想做什么: 我正在尝试将4位数的军事时间转换为标准的12小时时间格式,使用冒号和添加的PM或AM,而无需在我的代码之前导入任何内容(我正在创建一个只需要java 101技术的方法) 我的处境: 我有milTime,我现在每次运行它时都会手动更改它(如上面声明的,目前为1100),直到我将它转换为一个方法并提交赋值,在这个赋值中它将接收milTime,并返回milTimeString以供主程序打印。我目前正在使用BlueJ作为IDE(我不确定这是否是最好的使用方式?) 输入和输出示例: 如果给我

我想做什么:

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

我的处境:

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

输入和输出示例:

如果给我0056分,我将不得不在上午12:56返回。 如果给我1125分,我就得上午11点25分回来。 如果给2359,我就得晚上11点59分回来

我需要帮助的问题

  • 当我执行时,我的am/pm布尔值在某个地方失败,它总是输出pm,无论我输入11:24还是23:24
  • 很明显,我太努力了,无法生成输出,但我不知道更简单的方法(除了导入一些我不想做的事情)
  • 我谦恭地接受对我臃肿的现行代码的任何批评,以及对我冗长的请求的任何更正。我环顾四周寻找替代答案,所有涉及导入或超越我的知识的事情。感谢您抽出时间,并提前感谢所有人

    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);
    
        }
    }
    
    公共类时间测试
    {
    公共静态void main(字符串[]args)
    {   
    /*声明我的变量*/
    int milTime=2400;
    字符串timeString=“”;
    布尔pm;
    /*确定AM或PM,并将超过1200转换为时钟的数字*/
    如果(milTime>1259)
    {
    如果(米尔蒂姆)
    单个等号是赋值。要进行比较:

    if (pm == true)
    if (pm == false)
    
    这些也可以更习惯地写为:

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

    if (milTime < 1200)
    {
        pm = false;
    }
    else
    {
        pm = true;
        milTime -= 1200;
    }
    
    if(milTime<1200)
    {
    pm=假;
    }
    其他的
    {
    pm=真;
    milTime-=1200;
    }
    

    我将留给您一些其他错误。我相信这些更正至少会让您走得更远。

    您可以使用巧妙的字符串转换和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
    

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

    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;
    
    试试看!

    公共静态字符串转换器24hourtomam(字符串时间){
    
    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;
    }
    
    if(time==null) 返回时间; //转换时间,时间如下:0100200300…2300。。。 if(time.length()==4&&Helper.isInteger(time)){ 字符串小时=时间。子字符串(0,2); 字符串分钟数=时间。子字符串(2,4); 字符串meridian=“am”; if(小时子串(0,2)等于(“00”)){ 小时=“12”; }else如果(hour.substring(0,1).等于(“1”)| | hour.substring(0,1).等于(“2”)){ 子午线=“pm”; 整数军事小时=整数.parseInt(小时); 整数convertedHour=null; 如果(军事小时>12){ 换算小时=(军事小时-12); 如果(换算小时<10) hour=“0”+字符串.valueOf(convertedHour); 其他的 小时=字符串.valueOf(convertedHour); } } 时间=小时+:“+分钟+”+子午线; } //TODO-将时间转换为01:00…23:00。。。 返回时间; }
    如果您不想编码,您可以使用Joda Time Formatter轻松完成此任务:虽然我很想使用此库,但我不能,因为我的课程很初级。导入此库将降低我的作业成绩,因为我必须证明我可以在没有它的情况下完成此任务。非常感谢您的回复虽然!感谢您的回复,但作业特别要求不要为我们导入任何库或外部函数。
    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;
    }