将时间值转换为“hh:mm Am/Pm”格式,使用Android。

50

我正在从数据库中获取日期值,例如“2013-02-27 06:06:30”,使用StringTokenizer我将分别获取时间,如下所示

String startTime = "2013-02-27 06:06:30";

StringTokenizer token = new StringTokenizer(startTime);
String date1 = token.nextToken();  
String time1 = token.nextToken(); 

而在时间1中,我得到了结果 06:06:30,

我能否将其存储在另一个类型为String的变量中,如下所示?

String displayValue = "06:06 AM";

如果time1变量的值为

String time = 16:00:00;

那么它应该被转换为:

String displayValue = "04:00 PM";

//将AM-PM大写// fun String.capitalizeTime(): String { return this.replace("am", "AM").replace("pm", "PM") } - Stefan
10个回答

72

试试这个...

Date dt = new Date(date1);
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa");
String time1 = sdf.format(dt);

38

我只是这样做,就得到了答案。

startTime = "2013-02-27 21:06:30";
StringTokenizer tk = new StringTokenizer(startTime);
String date = tk.nextToken();  
String time = tk.nextToken();

SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
SimpleDateFormat sdfs = new SimpleDateFormat("hh:mm a");
Date dt;
try {    
    dt = sdf.parse(time);
    System.out.println("Time Display: " + sdfs.format(dt)); // <-- I got result here
} catch (ParseException e) {
    e.printStackTrace();
}

3
如果您的时间是xxxx-xx-xx 12:30:00,那么这个答案显示的时间是错误的,它显示的是上午12:30而不是下午12:30。 - Bhavik Mehta
1
@BhavikMehta 是的,我遇到了同样的问题。 - Mehul Ranpara
@MehulRanpara:在StackOverFlow上已经有很多解决方案了,只需要搜索一下就行。 - Bhavik Mehta
非常感谢您的帮助。 - Multidots Solutions
我也遇到了与Bhavik Metha相同的问题。请查看我的答案以获取解决方案。 - Nikhil
虽然格式正确,但解析不正确。我尝试使用 startTime = "2013-02-27 12:06:30"; 并期望得到下午12:06。但是我得到了 时间显示:上午12:06 - Ole V.V.

22

首先,您不需要使用StringTokenizer来获取字符串时间。只需像这样传递您的startTime

// Get date from string
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = dateFormatter.parse(startTime);

// Get time from date
SimpleDateFormat timeFormatter = new SimpleDateFormat("h:mm a");
String displayValue = timeFormatter.format(date);

// Done!

这是最简单的解决方案。谢谢。 - Bhavik Mehta

15

尝试这个

 String time = "22:35";

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

请跟着这个链接走 http://developer.android.com/reference/java/text/SimpleDateFormat.html


我曾经困惑如何将18:00:00 PM转换为06:00:00 PM。谢谢。通过使用“KK:mm:ss aa”,我得到了结果 :) - android learner
优秀的解决方案。谢谢。 - KSR
1
@androidlearner,你可能正在使用 HH:mm:ss aa。相反地,请使用 hh:mm:ss aa 来表示12小时制的上午下午格式。 - Hissaan Ali

10
Date dt = new Date(date1);
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa");
String time1 = sdf.format(dt);

输出时间为凌晨2点。

 Date dt = new Date(date1);
 SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a",Locale.US);
 String time1 = sdf.format(dt);

输出 2.00 上午


应该是 SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a",Locale.US); - pb123

8

我建议使用DateFormat,比如SimpleDateFormat


try {
    String timeLong = "2013-02-27 06:06:30";
    String timeShort = "16:06 AM";
    SimpleDateFormat formatLong = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
    SimpleDateFormat formatShort = new SimpleDateFormat("hh:mm aa", Locale.US);
    Log.v("out", formatShort.format(formatLong.parse(timeLong)));
    Log.v("out", formatShort.format(formatShort.parse(timeShort)));
} catch (ParseException e) {
    e.printStackTrace();
}

今天我感到很疲倦,而且我觉得这段代码中似乎有些东西缺失,所以我可能稍后会进行修改,但它确实有效,并且没有(直接)调用已弃用的 Date 类。


谢谢回复。我尝试了但没有用。它显示java.lang.IllegalArgumentException。 - Android learner

6

假设你需要以09:30 PM的格式显示当前时间。这将是一个相当简单的方法。即使你不需要当前时间,你也应该能够使用下面的DateFormat来满足你的需求。

Calendar cal = Calendar.getInstance();
DateFormat outputFormat = new SimpleDateFormat("KK:mm a");
String formattedTime = outputFormat.format(cal.getTime());

2 注意:以下格式化程序可用于以24小时制(21:30)显示相同的时间。

new SimpleDateFormat("HH:mm");

然而,如果您想构建与我第一个要点中相同的格式,最好使用以下代码,因为Java不鼓励使用StringTokenizer。 您可以在此处阅读有关它的信息,http://docs.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html

希望这能帮到您,谢谢!

    String startTime = "2013-02-27 21:06:30";
    String[] parts = startTime.split(" ");

    DateFormat outputFormat = new SimpleDateFormat("KK:mm a");
    SimpleDateFormat parseFormat = new SimpleDateFormat("hh:mm:ss");


    try {
        Date dt = parseFormat.parse(parts[1]);
        System.out.println(outputFormat.format(dt));
    } catch(ParseException exc) {
        exc.printStackTrace();
    }

4
只要按照以下模式使用,您就可以得到预期的结果:
    try {
        String time = "06:06:30";
        SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
        Date dt = sdf.parse(time);

        SimpleDateFormat sdfs = new SimpleDateFormat("hh:mm a");
        String formatedTime = sdfs.format(dt);

        Log.v("parseTime", formatedTime);

    } catch (ParseException e) {
        e.printStackTrace();
    }

愉快地编码 :)


似乎重复了接受答案中的内容(顺便提一下,接受答案并不完全正确)?此外,在2019年考虑不使用SimpleDateFormat。该类别以问题多而闻名,已经过时。相反,您可以将ThreeTenABP添加到您的Android项目中,以使用现代Java日期和时间APIjava.time。它更好用。 - Ole V.V.

2

选定的答案有显示错误时间的问题。如果您的时间是12:30:00,它会显示12:30 AM而不是12:30 PM。以下代码将帮助解决此问题。

SimpleDateFormat sdf = new SimpleDateFormat("KK:mm:ss");
SimpleDateFormat sdfs = new SimpleDateFormat("hh:mm a");

    Date dt1 = null;

    try {
        dt1 = sdf.parse("12:00:00");
        Log.i("Time in Am Pm  ", sdfs.format(dt1));

    } catch (ParseException e) {
        e.printStackTrace();
    }

1

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