日历:如何获取字符串“10:00 AM”

Calendar: how to get string “10:00 AM”

我正在尝试获取一个字符串,例如“上午 10:00”

int numberOfHourFrom_0_to_23=10;
Calendar m_auxCalendar = new GregorianCalendar();
m_auxCalendar.set(Calendar.HOUR, numberOfHourFrom_0_to_23 +12);//+12 makes it work correctly during PM hours, but not sure why.
m_auxCalendar.set(Calendar.MINUTE,0);

Date mdate=m_auxCalendar.getTime();
String mstring  = DateFormat.getTimeInstance(DateFormat.SHORT).format(mdate);

如果我在下午时段使用我的 Android phone,此代码可以正常工作(我得到“10:00 AM”);但是,如果我在上午使用我的phone,我得到的是“10:00 PM”而不是“10:00 AM”

我用不同的方法解决了它。也许,对你有帮助。但不幸的是,我无法在 Android...

上尝试代码

这是我的代码:

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

// other code...

int numberOfHourFrom_0_to_23 = 15;
String hour = numberOfHourFrom_0_to_23 + ""; // you need a string for the following parsing
                
String mstring = ""; 
// you have to do it here, because in the other case you do it in the try block, 
// you wouldn't have access on it after finishing it
try{
    DateFormat hh = new SimpleDateFormat("hh"); 
    // your input date format, in this case only hours
    Date date = hh.parse(hour); 
    /* you have to parse the value of the string to a Date object, 
    can throw a 'ParseException' exception --> try-catch */
            
    SimpleDateFormat targetFromat = new SimpleDateFormat("hh aa"); 
    // your target format, 'aa' is for AM/PM
            
    mstring = targetFromat.format(date);
    // the method formats the time to the new format (incl. AM/PM)
} catch(ParseException e){
    // exception threw by parse in the class Date
    System.err.println("There was an error during parsing the initial string.");
    e.printStackTrace();
}
        
System.out.println(mstring); // test output, in this case: 03 PM

也许您对这篇文章感兴趣:https://beginnersbook.com/2017/10/java-display-time-in-12-hour-format-with-ampm/(这个答案对我有帮助)。

更新: 阅读@Ole V.V 的评论后。 (感谢您的指正!),我查看了class DateTimeFormatter,我想在这里添加代码(它比我的第一个代码简单得多!):

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

// other code...

int numberOfHourFrom_0_to_23 = 15; 

LocalTime time = LocalTime.of(numberOfHourFrom_0_to_23, 0, 0);
// parameters: hour, minute, second

String formatPattern = "hh a";
// the pattern, "hh" is for the two hours positions and "a" for AM/PM

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatPattern);
String mstring = formatter.format(time);
// formatting the value and solve it as a String

System.out.println(mstring); // test output, in this case: 03 PM

java.time 通过脱糖

考虑使用 java.time,现代 Java 日期和时间 API,作为您的工作时间。

    DateTimeFormatter timeFormatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);
    
    int numberOfHourFrom0To23 = 10;
    LocalTime time = LocalTime.of(numberOfHourFrom0To23, 0);
    String mstring = time.format(timeFormatter);
    
    System.out.println(mstring);

美国语言环境的输出是(毫不奇怪):

10:00 AM

LocalTime 是一天中没有日期的时间,所以这里似乎就是您需要的全部内容。

你的代码出了什么问题?

没想到 Calendar.HOUR 指的是 AM 或 PM 中的小时,从 0 到 11。我一直不明白这有什么用。当您在早上创建一个 GregorianCalendar 并将其 HOUR 设置为 10 时,您将获得上午 10 点。当你在下午做同样的事情时,你会得到晚上 10 点。您试图通过增加 12 小时来进行补偿。现在您将小时设置为 22,即使范围是 o 到 11。任何像样的 class 都会抛出 IllegalArgumentException(或类似的)。不是具有默认设置的 Calendar 对象。相反,它会将时间调整到第二天 上午 10 点。现在,当您 运行 早上编写代码时,正如您观察到的那样,您会得到晚上 10 点。

问题:java.time 不需要 Android API 26 级吗?

java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更新的 Android 设备上(从 API 级别 26)内置了现代 API。
  • 在非Android Java 6 和 7 中获取 ThreeTen Backport,现代 classes 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接) .
  • 在较旧的 Android 上使用脱糖或 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。在后一种情况下,请确保使用子包从 org.threeten.bp 导入日期和时间 classes。

链接