【问题标题】:How to split date and time from a datetime string?如何从日期时间字符串中拆分日期和时间?
【发布时间】:2012-03-27 09:29:02
【问题描述】:

我有一个字符串 8/29/2011 11:16:12 AM。我想将该字符串拆分为单独的变量,例如

date = 8/29/2011
time = 11:16:12 AM

这可能吗?如果是这样,我该怎么做?

【问题讨论】:

  • 当我得到这种字符串时,我正在减去它并创建一个 Date 对象。但也许有更简单的方法。

标签: java android datetime split


【解决方案1】:

(编辑:请参阅下面的Answer by Ole V.V.,了解第一个版本的更现代(Java 8)方法)

一种方法是将其解析为日期对象并重新格式化:

    try {
        DateFormat f = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a");
        Date d = f.parse("8/29/2011 11:16:12 AM");
        DateFormat date = new SimpleDateFormat("MM/dd/yyyy");
        DateFormat time = new SimpleDateFormat("hh:mm:ss a");
        System.out.println("Date: " + date.format(d));
        System.out.println("Time: " + time.format(d));
    } catch (ParseException e) {
        e.printStackTrace();
    }

如果你只是想将它分割成日期时间片段,只需使用 split 来获取片段

    String date = "8/29/2011 11:16:12 AM";
    String[] parts = date.split(" ");
    System.out.println("Date: " + parts[0]);
    System.out.println("Time: " + parts[1] + " " + parts[2]);

    String date = "8/29/2011 11:16:12 AM";
    System.out.println("Date: " + date.substring(0, date.indexOf(' ')));
    System.out.println("Time: " + date.substring(date.indexOf(' ') + 1));

【讨论】:

  • 仅供参考,这里看到的日期时间类现在已经过时,被 JSR 310 中定义的 java.time 类所取代。有关现代解决方案,请参阅Answer by Ole V.V. .
  • @BasilBourque 当然,我会尝试更新它。另一件事是针对这个特定问题 - 如果不需要严格验证 - 只需拆分字符串或获取子字符串即可更快。
【解决方案2】:

为什么不使用 DateFormat?

查看http://docs.oracle.com/javase/7/docs/api/java/text/DateFormat.html

String str = "8/29/2011 11:16:12 AM";

String fmt = "MM/dd/yyyy HH:mm:ss a";
DateFormat df = new SimpleDateFormat(fmt);

Date dt = df.parse(str);

DateFormat tdf = new SimpleDateFormat("HH:mm:ss a");
DateFormat dfmt  = new SimpleDateFormat("MM/dd/yyyy");


String timeOnly = tdf.format(dt);
String dateOnly = dfmt.format(dt);

它提供了更多的工作/代码,但这是正确的方法。

【讨论】:

    【解决方案3】:

    java.time,现代 Java 日期和时间 API,以及 ThreeTenABP

    是时候有人为这个问题提供现代答案了。我在这里。

    不过,我对您的要求并不完全满意。对于绝大多数目的和情况,您不应将日期或时间保存在字符串中。您应该使用正确的日期时间对象。所以在我看来,这就是你应该做的:

        LocalDateTime dateTime = LocalDateTime.of(2011, Month.AUGUST, 29, 11, 16, 12);
        LocalDate date = dateTime.toLocalDate();
        LocalTime time = dateTime.toLocalTime();
        System.out.println("date = " + date);
        System.out.println("time = " + time);
    

    输出是:

    date = 2011-08-29
    time = 11:16:12
    

    假设 8/29/2011 11:16:12 AM 已作为用户输入输入,您需要将其解析为可保留在程序中的 LocalDateTime。是这样的:

        DateTimeFormatter formatter
                = DateTimeFormatter.ofPattern("M/d/u h:m:s a", Locale.ENGLISH);
        String userInput = "8/29/2011 11:16:12 AM";
        LocalDateTime dateTime = LocalDateTime.parse(userInput, formatter);
        System.out.println("dateTime = " + dateTime);
    
    dateTime = 2011-08-29T11:16:12
    

    换一种方式,输出给用户:如果您单独的日期和时间字符串仅用于输出,我们不需要在格式化为这些字符串之前将日期和时间分开。我们可以直接格式化LocalDateTime

        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("M/d/u");
        DateTimeFormatter timeFormatter
                = DateTimeFormatter.ofPattern("h:mm:ss a", Locale.ENGLISH);
        String dateString = dateTime.format(dateFormatter);
        String timeString = dateTime.format(timeFormatter);
        System.out.println("dateString = " + dateString);
        System.out.println("timeString = " + timeString);
    
    dateString = 8/29/2011
    timeString = 11:16:12 AM
    

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

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

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

    链接

    【讨论】:

      【解决方案4】:

      试试这个:

      String main = "8/29/2011 11:16:12 AM";
              String[] tmp;
              String date, time;
      
              tmp = main.split(" ");
      
              // [0] = 8/29/2011
              // [1] = 11:16:12
              // [2] = AM
      
              date = tmp[0].toString(); // 8/29/2011
              time = tmp[1].toString() + " " + tmp[2].toString(); // 11:16:12 AM
      

      【讨论】:

        【解决方案5】:
        String str = "8/29/2011 11:16:12 AM"
        String date = str.subString(0, str.indexOf(' '));
        String time  = str.subString(str.indexOf(' ')+1);
        

        【讨论】:

          【解决方案6】:

          试试 Java 中的split 函数:

          String my_string="8/29/2011 11:16:12 AM"
          String [] my_date_time = null;
          my_date_time = my_string.split(" ");
          String Date_str=my_date_time[0];
          String Time_str=my_date_time[1]+" "+my_date_time[2];
          

          你会得到像 Date_str="8/29/2011"Time_str="11:16:12 AM" 这样的可变字符串

          【讨论】:

            【解决方案7】:
            mDate = new Date();
            DateFormat timeFormat = SimpleDateFormat.getTimeInstance();
            DateFormat dateFormat = SimpleDateFormat.getDateInstance();
            timeFormat.format(mDate); // formats to: 4:53:03 AM
            dateFormat.format(mDate); // formats to: Oct 16, 2014
            

            【讨论】:

            • 请解释你的答案,而不是仅仅发布“试试这个”类型的解决方案。
            【解决方案8】:

            您可以通过将字符串拆分为两个子字符串来做到这一点,如下所示

            String main = "8/29/2011 11:16:12 AM";
            String s[] = main.split(" ",2);
            String date = s[0];
            String time = s[1];
            

            注意: split 方法会将字符串拆分为第二个参数中提到的两部分。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-08-15
              • 1970-01-01
              • 1970-01-01
              • 2018-07-16
              • 1970-01-01
              • 2021-11-08
              • 1970-01-01
              • 2020-05-30
              相关资源
              最近更新 更多