8

我有一个 ReST 服务,它下载有关人员日历中事件的信息......

当它返回日期和时间时,它将它们作为字符串返回

例如日期 =“2012 年 12 月 8 日”和时间 =“上午 11:25”

要将其放入 android 日历中,我需要执行以下操作:

Calendar beginTime = Calendar.getInstance();
beginTime.set(year, month, day, hour, min);
startMillis = beginTime.getTimeInMillis();
intent.put(Events.DTSTART, startMillis);

如何拆分日期和时间变量,以便它们在“beginTime.set()”方法中可用?

4

7 回答 7

9

我不认为您真的需要如何拆分字符串,在您的情况下应该是“如何从日期字符串中获取以毫秒为单位的时间”,这是一个示例:

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

public class DateTest {

    public static void main(String[] args) {
        String date = "12/8/2012";
        String time = "11:25 am";
        DateFormat df = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
        try {
            Date dt = df.parse(date + " " + time);
            Calendar ca = Calendar.getInstance();
            ca.setTime(dt);
            System.out.println(ca.getTimeInMillis());
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
于 2013-08-07T09:30:11.687 回答
4

试试这个:

String date = "12/8/2012";
String time = "11:25 am";

String[] date1 = date.split("/");
String[] time1 = time.split(":");
String[] time2 = time1[1].split(" ");  // to remove am/pm

Calendar beginTime = Calendar.getInstance();
beginTime.set(Integer.parseInt(date1[2]), Integer.parseInt(date1[1]), Integer.parseInt(date1[0]), Integer.parseInt(time1[0]), Integer.parseInt(time2[0]));
startMillis = beginTime.getTimeInMillis();
intent.put(Events.DTSTART, startMillis);

希望这可以帮助。

于 2013-08-07T09:17:14.440 回答
2

假设您以字符串格式获取日期(如果没有,请转换它!)然后:

String date = "12/8/2012";
String[] dateParts = date.split("/");
String day = dateParts[0]; 
String month = dateParts[1]; 

同样,你也可以分割时间!

于 2013-08-07T09:17:11.193 回答
0

您可以在此处查看拆分方法的示例:How to split a string in Java

然后只需将数组用作您的参数,例如:array[0] 表示年份等。

于 2013-08-07T09:16:41.887 回答
0

使用SimpleDateFormat(检查 api 文档)。如果您提供适当的时间模式,它将能够立即将字符串转换为日期。

于 2013-08-07T09:18:44.960 回答
0

这只是一个想法,您可以在不拆分的情况下做这样的事情

    DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy HH:mm a");
    Date date = formatter.parse("12/8/2012 11:25 am");      
    Calendar cal=Calendar.getInstance();
    cal.setTime(date);
于 2013-08-07T09:39:03.157 回答
0

java.time 通过脱糖或 ThreeTenABP

考虑为您的日期和时间工作使用现代 Java 日期和时间 API java.time。使用 java.time 可以直接将两个字符串分别解析为日期和时间,然后使用LoalDate.atTime().

我阅读您的代码的方式实际上是自 epoch 以来的毫秒数。这就是我在第一个片段中给你的内容。随意把它拆开,只使用你需要的线条。

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("d/M/u");
    DateTimeFormatter timeFormatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("h:mm a")
            .toFormatter(Locale.ENGLISH);
    
    String dateString = "12/8/2012";
    String timeString = "11:25 am";
    
    LocalDate date = LocalDate.parse(dateString, dateFormatter);
    LocalTime time = LocalTime.parse(timeString, timeFormatter);
    long startMillis = date
            .atTime(time)
            .atZone(ZoneId.systemDefault())
            .toInstant()
            .toEpochMilli();
    
    System.out.println(startMillis);

在我的时区(8 月 UTC 偏移 +02:00)运行时,输出为:

1344763500000

对于那些确实需要两个字符串中的单个数字的人来说,获得这些也很简单。例如:

    int year = date.getYear();
    Month month = date.getMonth();
    int monthNumber = date.getMonthValue();
    int dayOfMonth = date.getDayOfMonth();
    int hourOfDay = time.getHour();
    int hourWithinAmOrPm = time.get(ChronoField.HOUR_OF_AMPM);
    int minute = time.getMinute();
    
    System.out.format("Year %d month %s or %d day %d hour %d or %d AM/PM minute %d%n",
            year, month, monthNumber, dayOfMonth, hourOfDay, hourWithinAmOrPm, minute);

2012 年月 AUGUST 或 8 天 12 小时 11 或 11 AM/PM 分钟 25

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

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

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

链接

于 2020-10-09T14:13:13.917 回答