如何将24小时制时间转换为12小时制?

53
在我的应用程序中,我想将给定的CDT格式的24小时字符串转换为CDT格式的12小时字符串,如何将给定的24小时格式字符串转换为12小时格式字符串?
17个回答

86

以下是将24小时制时间转换为带上午下午的12小时制代码。
注意: 如果不需要上午/下午,则将 hh:mm a 替换为 hh:mm

import java.text.SimpleDateFormat;
import java.util.Date;

public class Main {
   public static void main(String [] args) throws Exception {
       try {       
           String _24HourTime = "22:15";
           SimpleDateFormat _24HourSDF = new SimpleDateFormat("HH:mm");
           SimpleDateFormat _12HourSDF = new SimpleDateFormat("hh:mm a");
           Date _24HourDt = _24HourSDF.parse(_24HourTime);
           System.out.println(_24HourDt);
           System.out.println(_12HourSDF.format(_24HourDt));
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}

//OUTPUT WOULD BE
//Thu Jan 01 22:15:00 IST 1970
//10:15 PM

另一种解决方案:

System.out.println(hr%12 + ":" + min + " " + ((hr>=12) ? "PM" : "AM"));

6
“其他的解决方案”对于午夜和中午不会输出“0”吗?你需要为这些情况添加一个特殊条件。” - Mark Sholund
System.out.println(((hourOfDay%12==0) ? "12" : String.valueOf(hourOfDay%12)) + ":" + (minute>9 ? minute : "0"+minute) + " " +((hourOfDay>=12) ? "PM" : "AM")) 可以处理所有情况。 - Darshan Soni
System.out.println((((hourOfDay % 12 == 0) ? "12" : ((hourOfDay % 12) > 9 ? (hourOfDay % 12) : "0" + (hourOfDay % 12))) + ":" + ((minute > 9) ? minute : ("0" + minute)) + " " + ((hourOfDay >= 12) ? "PM" : "AM"))); - Renish Patel

65

您可以尝试使用SimpleDateFormat对象来转换时间格式。

final String time = "23:15";

try {
    final SimpleDateFormat sdf = new SimpleDateFormat("H:mm");
    final Date dateObj = sdf.parse(time);
    System.out.println(dateObj);
    System.out.println(new SimpleDateFormat("K:mm").format(dateObj));
} catch (final ParseException e) {
    e.printStackTrace();
}

这里是SimpleDateFormat的javadoc 链接


我有一个小疑问!如何判断是上午还是下午? - Adarsh H S
16
如果是上午/下午,SimpleDateFormat("K:mm a") 将会给出什么结果? - Adarsh H S
6
可以使用hh:mm aa代替K:mm,这将直接返回带有AM/PM的时间。 - Mitesh Shah
3
我遇到了一个问题,当时间是24小时制的"12:00"时,转换后显示为"00:00 pm",请帮我解决。 - Prasad
2
这是被接受的疯狂行为,它产生00:00pm的事实意味着答案非常错误。请参见https://dev59.com/KGw05IYBdhLWcg3w_Guw#16190056获取正确答案。 - Daniel Wilson

17

使用Java 8,可以使用类java.time.LocalTime将其完成一行代码中。

示例代码:

String result = LocalTime.parse(time, DateTimeFormatter.ofPattern("HH:mm")).format(DateTimeFormatter.ofPattern("hh:mm a"));

对于较早的 Android 版本,请使用 ThreeTen-Backport 项目,该项目已适配成 Android 中的 ThreeTenABP 项目。请参见 如何在 Android 项目中使用 ThreeTenABP


1
这里我们需要传递的分钟值始终是两位数。例如,对于下午3点-15:00。 - Ajay Prajapati
我发现这行代码已经足够了:String result = localTimeInstance.format(DateTimeFormatter.ofPattern("hh:mm a")); - Saleh Rezq
Saleh Rezq,是的,如果你一开始就用LocalTime表示时间,那么这已经足够了。但是如果你用字符串表示时间,那么你需要先使用LocalTime.parse。 - Cloud

6

对于使用较低api版本的用户, 如果时间为12:00 AM或PM且分钟数小于10,则正常工作。

  String time =  ((hourOfDay > 12) ? hourOfDay % 12 : hourOfDay) + ":" + (minute < 10 ? ("0" + minute) : minute) + " " + ((hourOfDay >= 12) ? "PM" : "AM")

输出示例:上午 0:0 下午 12:00 上午 9:09

感谢 @Lalit Jawale 上面的回答。


@BasilBourque 你是否尝试在 API 16 上运行该代码?该类 LocalTime.parse 需要 API 26 或更高版本。 - Xianwei
对于早期的Android版本,请使用ThreeTen-Backport项目,该项目已经适配到了Android中的ThreeTenABP项目中。请参阅如何在Android项目中使用ThreeTenABP - Basil Bourque
@BasilBourque 非常感谢您。 - Xianwei
比 API 方法更快 - ucMedia
1
使用12小时制,午夜应表示为“12”,而不是“0”。 - Victor Rendina
显示剩余2条评论

4

如果您想知道K、k、H和h之间的区别:

H 一天中的小时(0-23) 数字 0 1+

k 一天中的小时(1-24) 数字 24 1+

K 上午/下午的小时(0-11) 数字 0 1+

h 上午/下午的小时(1-12) 数字 12 1+


3
// time is your string value i.e., 24 hour time

    try {
    final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
                final Date dateObj = sdf.parse(time);
                time = new SimpleDateFormat("hh:mm aa").format(dateObj);
            } catch (final ParseException e) {
                e.printStackTrace();
            }

使用(K:mm)格式的SimpleDateFormat可以正常工作,但是对于时间为12:00 AM或12:00 PM的情况无法正常工作。

您可以使用上述代码将12小时制转换为24小时制,同时包括AM/PM...它能正常工作。


2

如果不必要的话,我不喜欢使用类似于SimpleDateFormat这样的类。你只需要检查三个条件。以下是一些替代方案:

简单:

if(hour>11) {
    suffix = "PM";
    if(hour>12)
        hour -= 12;
} else {
    suffix = "AM";
    if(hour==0)
        hour = 12;
}

简述:

suffix = (hour>11) ? "PM" : "AM";
hour = (hour>12) ? hour-=12 : ((hour==0) ? 12 : hour);

结果:

00:00 = 12:00 AM, 01:00 = 01:00 AM, 02:00 = 02:00 AM, 03:00 = 03:00 AM, 04:00 = 04:00 AM, 05:00 = 05:00 AM, 06:00 = 06:00 AM, 07:00 = 07:00 AM, 08:00 = 08:00 AM, 09:00 = 09:00 AM, 10:00 = 10:00 AM, 11:00 = 11:00 AM, 12:00 = 12:00 PM, 13:00 = 01:00 PM, 14:00 = 02:00 PM, 15:00 = 03:00 PM, 16:00 = 04:00 PM, 17:00 = 05:00 PM, 18:00 = 06:00 PM, 19:00 = 07:00 PM, 20:00 = 08:00 PM, 21:00 = 09:00 PM, 22:00 = 10:00 PM, 23:00 = 11:00 PM

2
以简洁的方式,您可以这样做:
fun convertTo12Hours(militaryTime: String): String{
        //in => "14:00:00"
        //out => "02:00 PM"
        val inputFormat = SimpleDateFormat("hh:mm:ss", Locale.getDefault())
        val outputFormat = SimpleDateFormat("hh:mm aa", Locale.getDefault())
        val date = inputFormat.parse(militaryTime)
        return outputFormat.format(date)
    }

1
int n=2;
int result= n-12;

if (result>o) {
    system.out.println(result+"pm");
} else {
    system.out.prinln(result+"am");
} 

你可以使用Scanner来获取用户输入。希望这很简单,12点见 :)

1
如果n=2,那么n不总是10吗? - Ray

0

这是我的解决方案:

/*
* hour in 24Format -> AM/PM Format
*/
public String format(int hour, int minutes ){

   String meridiem = hour > 11 ? "PM" : "AM";

   // trim "0-23 hour" to "0-11 hour", then replace "0" with "12" 
   hour = (hour %= 12) == 0 ? 12 : hour;

   // Apply desired format "HH:MM AM/PM"
   return String.format("%02d:%02d %s", hour, minutes, meridiem );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接