【问题标题】:How to retrieve minutes from string date?如何从字符串日期中检索分钟?
【发布时间】:2016-05-03 03:38:11
【问题描述】:

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

这是我在类中的存储方式:

    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 对象中得到。我以字符串格式存储日期。如何转换?

【问题讨论】:

  • 我只想要时间到分钟。 @ParkerHalo
  • 字符串看起来像 -- Wed Jan 27 07:25:29 GMT+05:30 2016
  • 时间显示为 7:25,所以我希望它整体为 445。即 7 * 60 和加分钟。
  • 谢谢.. 等待答复...@ParkerHalo

标签: java android string date


【解决方案1】:

使用Joda-Time

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();

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

apply plugin: 'android'
dependencies {
   compile 'joda-time:joda-time:2.4'
   compile 'joda-time:joda-time:2.2'

}

【讨论】:

  • 1.我认为导入外部库不足以完成这么小的任务。 2. 我认为他不想要两个日期之间的差异,他只想将当前时间(例如 07:25)计算为分钟
  • @ParkerHalo Java 7 中的日历/日期对象已损坏,不应使用。
  • 我同意它们有时很棘手,但是坏了?如果这是真的,我必须阅读一些关于该主题的内容!
  • @ParkerHalo 众所周知的问题,我在我的应用程序中遇到了这些对象的问题。
  • 我明白了,然后我收回我的声明。您是否尝试过 java8 日期/时间 API?他们在那个主题上有进步吗?
【解决方案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 实现。

【讨论】:

  • 感谢您的回答.. format.parse 方法出现未处理的异常错误。 @约翰杜克..
  • 即使这不能解决您的异常,您也应该将您的代码放在 try - catch 块中。您可能会遇到异常,因为您解析的字符串格式与您在 SimpleDateFormat 中的设置不同,因此您必须与格式化的字符串保持一致。如果您提供您尝试格式化的字符串示例,我将帮助您解决代码。
【解决方案3】:

通常我建议使用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(...) 将这些数字解析为整数并计算分钟数!

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
    • 这个答案显示了从字符串传递到日期的过程,而不是从日期中提取分钟。它不显示代码,只显示过程,所以它是一个答案。这取决于谁提出问题,是显示代码还是只显示逻辑步骤更好,我认为这里显示逻辑而不是代码更好。但其他人也用具体的代码帮助了 OP。
    【解决方案5】:

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

    • 如何解析字符串以获取日期时间对象
    • 如何从日期时间对象获取自一天开始以来的分钟数

    第一个,将字符串解析为日期时间,已在 Stack Overflow 上的 at least 1,845 times 中介绍过,因此我将跳过它。第二个问题在下面解决。

    请尽量让您的问题更清楚。并尽可能专注于单个主题,因为这就是 Stack Overflow 的意图。

    每日分钟

    您似乎想要的是“Minutes-Of-Day”,即自一天开始以来的分钟数。

    这里要小心和深思熟虑,因为有两种不同的定义来表示一天中的分钟。您可以获得特定时区中特定日期的实际分钟数。或者您可以计算一般的 24 小时一天。由于夏令时 (DST) 和其他异常情况,一天不一定是 24 小时。例如,在美国大部分地区,使用 DST 意味着一天可能有 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 日。这一天是美国大部分地区的“春天提前”夏令时转换日。时钟从凌晨 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 枚举提供了许多访问TemporalField 值的方法,例如MINUTE_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[美国/洛杉矶] | minutesOfDayForGeneric24HourDay: 180 |持续时间:PT2H | minutesOfDayForActualDay: 120

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      相关资源
      最近更新 更多