考虑到区域设置时间分隔符,如何将HH:mm解析为分钟数?

时间:2017-03-23 18:15:23

标签: java time java-8 locale separator

我有一个'HH:mm'格式的输入字符串,其中时间分隔符是根据区域设置设置的(例如,美国的'10:45'或意大利的'10 .45')。我需要将其转换为分钟数。

以下是我提出的建议:

String timeSeparator = getTimeSeparator(locale);
String[] duration = durationString.split(Pattern.quote(timeSeparator));
int minutes = Integer.valueOf(duration[0])*60 + Integer.valueOf(duration[1]);
https://stackoverflow.com/a/7612009/7753225

获取的

getTimeSeparator方法

有没有更简单的方法?例如,使用`java.time'。

5 个答案:

答案 0 :(得分:1)

在Java 8中,您可以使用DateTimeFormatter.ofLocalizedTime来获取特定于语言环境的日期时格式化程序。然后,您可以将其用于parse the string into a LocalTimeextract the minute field

public static int getMinute(String timeString, Locale locale) {
  DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT)
                                                 .withLocale(locale);
  LocalTime time = LocalTime.parse(timeString, formatter);
  return time.getHour()*60 + time.getMinute();
}

示例:

System.out.println(getMinute("10.47", new Locale("fi")));   // 647
System.out.println(getMinute("11:23", Locale.ROOT));        // 683

如果您不关心时间分隔符,我们可以使用固定模式。

public static int getMinute(String timeString, Locale locale) {
  DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH[:][.]mm", locale);
  LocalTime time = LocalTime.parse(timeString, formatter);
  return time.getHour()*60 + time.getMinute();
}

[…]表示可选,因此它将匹配HH:mmHH.mmHHmmHH:.mm

答案 1 :(得分:1)

TL;博士

Duration.parse( 
    "PT" + 
    "10:45".replace( ":" , "M" )
           .replace( "-" , "M" )
           .replace( "." , "M" )
           .replace( "," , "M" )
    + "S" 
).toMinutes()
  

“10:45”→PT10M45S→10

ISO 8601格式

ISO 8601标准定义了未附加到时间线的此类时间范围的格式:PnYnMnDTnHnMnS

P标志着开始。 T将任何年 - 月 - 天与小时 - 分 - 秒分开。所以一个半小时是PT1H30M。你的十分四十五秒的例子是PT10M45S

执行简单的字符串操作,将输入转换为此格式。

String input = "10:45" ;
String inputStandardized = "PT" + 
    input.replace( ":" , "M" )
         .replace( "-" , "M" )
         .replace( "." , "M" )
         .replace( "," , "M" )
         + "S" ;
  

PT10M45S

Duration

解析为Duration。在解析和生成字符串时,java.time类默认使用ISO 8601格式。因此无需指定格式化模式。

Duration duration = Duration.parse( inputStandardized );
  

duration.toString():PT10M45S

您可以使用Duration对象进行日期时间数学运算,转到plusminus。因此,您可能不需要分钟数作为整数。但是你可以要求持续时间内的总分钟数。

long minutes = duration.toMinutes();
  

10

请参阅此code run live at IdeOne.com

提示:在一段时间内使用时钟时间格式会产生麻烦。模棱两可导致混乱和错误。我建议使用标准的ISO 8601格式作为持续时间,因为它们被设计为明确,易于阅读和易于解析。

答案 2 :(得分:1)

请注意非常优雅,但它可以完成这项工作

.wrap {
    height: 2000px;
}

section#overview{
    width: 100%
    background: linear-gradient(to bottom, rgba(206,206,206,0.3),      rgba(206,206,206,1)); 
}
aside {
    float: right;
    width: 25%;
    height: 100%;
    background: linear-gradient(to bottom, rgba(206,206,206,0.3), rgba(206,206,206,1));
}

答案 3 :(得分:0)

您可以使用getLocalizedDateTimePattern方法获取初始化DateTimeFormatter的模式,以使用给定的区域设置解析时间。第一个null代表您在案件中不需要的日期。

String timePattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
            null, FormatStyle.SHORT, IsoChronology.INSTANCE, locale);

然后使用它来创建格式化程序(请注意,您必须再次指定区域设置):

DateTimeFormatter dtf = DateTimeFormatter.ofPattern(timePattern, locale);

如果不是SHORT locale时间格式,而是"HHcmm" 'c'locale是一个非数字字符,它是String[] duration = durationString.split("\\D"); int minutes = parseInt(duration[0])*60 + parseInt(duration[1]); 的时间分隔符然后是:

  1. 从文本中提取数字

    DateTimeFormatter
  2. 使用时间分隔符

    制作DateTimeFormatter dtf = DateTimeFormatter.ofPattern( String.format("HH%smm", timeSeparator), locale); LocalTime time = LocalTime.parse(text, dtf); int minutes = time.toSecondOfDay() / 60;
    int minutes = ChronoUnit.MINUTES.between(LocalTime.MIN, time);
    

    或者如果你必须

    let integerArray: [Int] = [1,2,3,4,5]
    UserDefaults.standard.set(integerArray, forKey: "sugarArray")
    

答案 4 :(得分:0)

首先将时间解析为launchservicesd[83]: SecTaskLoadEntitlements failed error=22个实例,然后使用LocalTime计算到当天开始的差异:

Duration

以上结果为645