如何从字符串日期检索分钟?

时间:2016-01-26 14:25:59

标签: java android string date

我已将日期存储在字符串中。现在我想从日期字符串中获取分钟数。如何将其转换为分钟?

以下是我在课堂上的存储方式:

    public String fromDate;
    public String toDate;

我设置了getter和setter方法。我已经保存了日期值,现在我想要检索该值并转换为分钟。

像这样重复:

  Calendar c  = Calendar.getInstance();

  String datefrom = eventData.getFromDate();

我尝试使用此日历实例:

 c.set(Calendar.HOUR, hour);
            c.set(Calendar.MINUTE, minute);
            c.set(Calendar.DATE,day);
            Date datefrom = c.getTime();
            startTime = String.valueOf(datefrom);
            int hour = c.get(Calendar.HOUR);
            int totalMinutes = hour * 60;

但是我可以从Date对象获得。我以String格式存储日期。我该怎么转换呢?

5 个答案:

答案 0 :(得分:3)

使用Joda-Time

.

要导入Android Studio,请更新build.gradle文件:

String fromDate;
String toDate;
DateTimeFormatter format = new DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTime fromDT = format.parseDateTime(fromDate);
DateTime toDT = format.parseDateTime(toDate);
Duration duration = new Duration(fromDT, toDT);
int minutes = duration.getStandardMinutes();

答案 1 :(得分:2)

要在Java中将String转换为Date,您必须使用DateFormat,例如下面的示例:

String string = "January 26, 2016";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date); // Tue Jan 26 00:00:00 GMT 2016

然后您可以继续执行Calendar

答案 2 :(得分:1)

通常我建议用SimpleDateFormat来解析时间,但我认为在这种情况下(因为日期似乎有一个定义的形式,并且时区可能存在问题)我建议你自己检索信息:

String date = "Wed Jan 27 07:25:29 GMT+05:30 2016";
String[] times = date.substring(11, 16).split(":");
int minutes = Integer.parseInt(times[0]) * 60 + Integer.parseInt(times[1]);
System.out.println(minutes);
  • 部分date.substring(11, 16)从字符串("07:25")中提取小时和分钟部分。
  • 部分.split(":");将字符串"07:25"拆分为两个字符串:"07""25"
  • 之后,您只需将这些数字解析为Integer.parseInt(...)的整数并计算分钟数!

答案 3 :(得分:0)

要获得String的分钟数,可以使用DateFormatstring转换为Date,然后再使用您的代码。

答案 4 :(得分:0)

你的问题实际上是两个问题:

  • 如何解析String以获取日期时间对象
  • 如何从日期时间对象获取自开始日起的分钟数

第一个,将String解析为日期时间,已经在Stack Overflow上被覆盖at least 1,845 times,所以我将跳过它。第二个问题在下面讨论。

请尽量让您的问题更清晰。并尽可能狭隘地关注单个主题,因为这是Stack Overflow的意图。

分钟的日

您似乎想要的是“每日一分钟”,即自当天开始以来的分钟数。

在这里要小心谨慎,因为有两个不同的定义,用于分钟。您可以获取特定时区内特定日期的实际分钟数。或者,您可以计算通用的24小时工作日。由于夏令时(DST)和其他异常,一天不一定是24小时。例如,在美国的大部分地区,使用夏令时意味着一天可能是23,24或25小时。

问题的代码和其他答案忽略了时区的关键问题(日期工作中的常见错误)。如果未指定时区,则会以静默方式应用JVM的当前默认时区。不好......默认情况下可以随时改变,甚至运行时期间!最好总是指定您期望/期望的时区。

避免旧的日期时间类

与最早版本的Java捆绑在一起的旧日期时间类是众所周知的麻烦。避免他们。而是使用Java 8及更高版本中内置的java.time框架(请参阅Tutorial)。如果您无法使用该技术,请使用Joda-Time库(启发了java.time)。以下示例位于Java 8 Update 66中的java.time中。

java.time

让我们看看2015年3月3日。这一天是美国大部分地区的“春天未来”DST转换日。时钟从凌晨2点跳到凌晨3点。因此,03:00:00.0这一天意味着自当天开始以来已经过了两小时(120分钟)。如果我们将此视为一般24小时工作日,我们会说三小时(180分钟)过去了。 java.time类可以计算两个定义中的每日分钟。

首先我们在转换日凌晨3点。我们使用其中一个识别DST的时区。

ZoneId zoneId = ZoneId.of ( "America/Los_Angeles" );
ZonedDateTime zdt = ZonedDateTime.of ( 2015 , 3 , 8 , 3 , 0 , 0 , 0 , zoneId );

通用24小时日

接下来,我们假设一天24小时的通用,从一天开始就得到会议记录。 ChronoField枚举提供了多种方式来访问TemporalFieldMINUTE_OF_DAY值。

long minutesOfDayForGeneric24HourDay = zdt.get ( ChronoField.MINUTE_OF_DAY );

实际日

要获得自DST转换的特定时区此特定日期开始以来经过的实际分钟数,我们必须做更多工作。我们必须确定当天的第一个时刻,我们可以从中计算经过的时间。要获得第一个时刻,我们必须通过LocalDate类,这是一个仅限日期的值,没有时间或时区。在LocalDate个对象上,我们调用atStartOfDay调整回日期时间值(ZonedDateTime)。你可能认为你可以通过假设这一天从00:00:00.0开始来跳过这个但是并非总是如此。

ZonedDateTime zdtStart = zdt.toLocalDate ().atStartOfDay ( zoneId );

现在计算经过的时间。 Duration类表示小时,分钟和秒的时间跨度。从Duration我们可以询问总分钟数,将小时数转换为分钟数。

Duration duration = Duration.between ( zdtStart , zdt );
long minutesOfDayForActualDay = duration.toMinutes ();

转储到控制台。请注意,通用ChronoField方法如何表示180分钟,而实际的Duration方法会产生120分钟。

System.out.println ( "zdt: " + zdt + " | minutesOfDayForGeneric24HourDay: " + minutesOfDayForGeneric24HourDay + " | duration: " + duration + " | minutesOfDayForActualDay: " + minutesOfDayForActualDay );
  

zdt:2015-03-08T03:00-07:00 [America / Los_Angeles] | minutesOfDayForGeneric24HourDay:180 |持续时间:PT2H | minutesOfDayForActualDay:120