【问题标题】:How to convert "hh:mm AM/PM" string to formatted time? [duplicate]如何将“hh:mm AM/PM”字符串转换为格式化时间? [复制]
【发布时间】:2018-07-20 22:19:43
【问题描述】:

我的字符串输入为“03:00 PM”或“09:00 AM”,我想将其转换为格式化时间甚至整数。这样我就可以按时间顺序比较它们。 任何人都可以帮助我吗?

提前谢谢你。

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 我尝试创建一系列字符串时间数组(从上午 9:00 到下午 7:00)。然后将输入的 srtstring 与数组进行比较并获取位置。但发现它并不聪明和高效,因为可能有各种各样的时间
  • @AmitBera 你有什么想法吗?
  • 请在发帖前搜索研究。你会发现的。 :-)
  • 虽然这是一个不同的问题,但我相信这个问题应该会有所帮助:SimpleDateFormat and not allowing it to go above 12 hours

标签: java android android-studio datetime


【解决方案1】:

试试这个

import java.text.SimpleDateFormat;  
    import java.util.Date;  
    public class StringToDateExample1 {  
    public static void main(String[] args)throws Exception {  
        String sDate1="03:00 PM";  
        Date date1=new SimpleDateFormat("HH:mm").parse(sDate1);  

    }  
   }  

【讨论】:

【解决方案2】:

TL;DR

    DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH);
    String input = "03:00 PM";
    LocalTime time = LocalTime.parse(input, inputFormatter);
    System.out.println(time);

打印出来

15:00

编辑:由于您的时间格式是英文,因此使用此格式化程序可能会更简洁:

    DateTimeFormatter inputFormatter
            = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT)
                    .withLocale(Locale.ENGLISH);

它几乎匹配。后一种格式化程序将 10 小时前的几小时格式化为只有一位数字,例如 5:12 AM,但在解析时也接受两位数字,因此它可以工作。

java.time

我建议您使用java.time 中的LocalTime 来表示一天中的时间,这正是它的用途。因此,它为您提供了良好的建模和自记录代码。

其他答案是正确的,但很差。虽然您应该为您的任务使用库类,但至少出于三个原因,您不应该使用SimpleDateFormatDate。 (1) 陈旧过时,设计不良; (2) DateFormatSimpleDateFormat 特别是出了名的麻烦; (3) Date 不代表一天中的时间。

比较时间

    LocalTime anotherTime = LocalTime.parse("09:00 AM", inputFormatter);
    if (anotherTime.isBefore(time)) {
        System.out.println("" + anotherTime + " comes before " + time);
    } else {
        System.out.println("" + time + " comes before " + anotherTime);
    }

打印出来

09:00 comes before 15:00

再次,使用LocalTime 进行比较,它比使用格式化字符串更清晰。可能更好,LocalTime 实现了Comparable,因此您可以使用Collections.sort() 和其他依赖于对象自然排序的函数。

如果你确实想要一个格式化的字符串,第一个选项是LocalTime.toString():

    String formattedTime = time.toString();
    System.out.println(formattedTime);

这将打印与我们上面得到的相同的输出,15:00。如果您想要不同的格式,请定义第二个DateTimeFormatter 并在LocalTime.format() 中使用它。

问题:我可以在 Android 上使用 java.time 吗?

是的,您可以在 Android 上使用 java.time。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及较新的 Android 设备上,内置了现代 API。
  • 在 Java 6 和 7 中,获取 ThreeTen Backport,即新类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
  • 在较旧的 Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

【讨论】:

    【解决方案3】:

    这可能不是最佳解决方案。但是您可以做的是将输入时间转换为秒,然后比较整数值。

    以下功能可以帮助您了解如何获得秒数。 (只是一个伪代码。不是经过测试的)

    public int getSeconds(String timeValue){
    
    String[] splitByColon = timeValue.split(":"); 
    int hoursValue = Integer.parseInt(splitByColon[0])); 
    
    String[] splitForMins = splitByColon[1].split(" "); 
    
    if(splitForMins[1].equals("PM"))
    {
    hoursValue = hoursValue + 12; 
    }
    
    int minutesValue = Integer.parseInt(splitForMins[0]); 
    
    return 3600*hoursValue + 60*minutesValue; 
    
    }
    

    【讨论】:

    • 它不适用于 if(splitForMins[1] == "PM") 。更改为 .equals("PM") ,现在可以正常工作了。谢谢
    • 是的,对不起。它只是一个伪代码。我没有测试它。 .感谢编辑
    【解决方案4】:

    您可以使用日期格式。如果您确定全部是英文,请使用Locale.ENGLISH

    static Date convertTimeString(String timeString) {
    
        try {
            return DateFormat.getTimeInstance(DateFormat.SHORT, Locale.ENGLISH)
                    .parse(timeString);
        } catch(ParseException e) {
            Log.e("CONVERTDATE", "String \"" + timeString + "\" couldn't be parsed");
            return null;
        }
    }
    

    【讨论】:

      【解决方案5】:

      最好的方法。

      1. 首先从(编辑文本或其他)获取字符串。
      2. 将字符串拆分为 2 部分 1st time number'AM' or 'PM'
      3. 检查2位是AM还是PM所以
      4. 检查字符串是 AM 还是 PM,如果字符串是 PM,则添加 数字时间12 您将获得 24 小时格式的时间

      【讨论】:

        【解决方案6】:
        SimpleDateFormat myFormat = new SimpleDateFormat("hh:mm a");
        String time="09:00 AM";  
            try {
        
                Date date=myFormat.parse(time);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        

        在日期变量上,您将有时间

        【讨论】:

        • 长话短说,你的时间格式的格式字符串是"hh:mm a"
        【解决方案7】:

        你可以试试下面的代码:

        String strTime = "03:00 pm";
        SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm aa");
        Date date = dateFormat.parse(strTime);
        long time = date.getTime();
        

        【讨论】:

          【解决方案8】:
          import java.util.*;
          import java.text.*;
          
          public class DateDemo {
          
             public static void main(String args[]) {
                String time1="10:00 AM",time2="11:00 PM";
                DateFormat dfrmt = new SimpleDateFormat ("hh:mm a");
                Date Dtime1 =new Date();
                Date Dtime2 =new Date();
                try{
                   Dtime1 = dfrmt.parse(time1);
                   Dtime2 = dfrmt.parse(time2);
                }catch(Exception e){
                }
          
                if(Dtime1.compareTo(Dtime2)>0){
                    //DTime1 comes after Dtime2
                    System.out.println(dfrmt.format(Dtime1) + " > " + dfrmt.format(Dtime2));
                }else if(Dtime1.compareTo(Dtime2)<0){
                    //Dtime1 Comes Before Dtime2
                     System.out.println(dfrmt.format(Dtime1) + " < " + dfrmt.format(Dtime2));
                }
                else{
                    //Equal   
                    System.out.println(dfrmt.format(Dtime1) + " == " + dfrmt.format(Dtime2));
                }
          
           }
          }
          

          试试这个比较两个日期; 创建日期时间对象并使用comapreTo()函数

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-02-17
            • 2011-07-16
            • 2013-04-11
            • 1970-01-01
            • 2021-01-29
            • 1970-01-01
            • 2017-04-08
            • 2017-01-16
            相关资源
            最近更新 更多