2017-03-23 12 views
3

我有一個'HH:mm'格式的輸入字符串,其中時間分隔符是根據區域設置設置的(例如,'10:45'代表美國或'10 .45'代表意大利)。我需要將其轉換爲分鐘數量。如何將HH:mm分析爲考慮語言環境時間分隔符的分鐘數?

這裏是我想出了:

String timeSeparator = getTimeSeparator(locale); 
String[] duration = durationString.split(Pattern.quote(timeSeparator)); 
int minutes = Integer.valueOf(duration[0])*60 + Integer.valueOf(duration[1]); 

getTimeSeparator方法從https://stackoverflow.com/a/7612009/7753225

採取有什麼簡單的方法?例如使用`java.time'。

+0

你可以刪除Integer.valueOf(),(即使在當時,它會被autoboxed)。我認爲JodaTime有這個選擇。從日期時間獲取分鐘數/秒/無論如何 – Wietlol

+3

爲什麼不直接忽略分隔符? int minute = Integer.parseInt(durationString.substring(0,2))* 60 + Integer.parseInt(durationString.substring(3))' – Andreas

回答

0

您可以使用getLocalizedDateTimePattern方法獲得一個模式,用於初始化DateTimeFormatter,以使用給定的語言環境解析時間。第一個null是你不需要的日期。

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

然後你使用它來創建一個格式化(請注意,您必須再次指定區域):

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

如果不是你期望"HHcmm"localeSHORT時間格式,其中'c'是非數字字符,即locale的時間分隔符,則:

  1. extract nu從文本

    String[] duration = durationString.split("\\D"); 
    int minutes = parseInt(duration[0])*60 + parseInt(duration[1]); 
    
  2. mbers做出DateTimeFormatter與時間分隔符

    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); 
    
+0

如果locale是US,那麼這裏也會是DateTimeParseException,因爲輸入在'HH: mm「格式,而不是'HH:mm aa' – Lega

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

+0

如果語言環境爲美國,將會出現DateTimeParseException,因爲timeString的格式爲'HH:mm',而不是'HH:mm aa' – Lega

+1

@Lega那麼意思是'HH:mm'不是美國的預期區域設置格式。查看更新以獲取替代方案。 – kennytm

+0

'return time.getMinute();'將僅返回LocalTime的一小部分,這應該是'return time.getHour()* 60 + time.getMinute();'從午夜返回分鐘 – tomasz77

0

首先解析時間爲LocalTime實例,隨後計算差值的一天使用Duration開始:

以上
DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
      .appendLocalized(null, FormatStyle.SHORT) 
      .toFormatter(Locale.ITALY); 
    LocalTime time = LocalTime.from(formatter.parse("10.45")); 
    long minutes = Duration.between(LocalTime.MIN, time).toMinutes(); 

結果645

+0

如果locale是US,那麼這裏也會是DateTimeParseException,因爲輸入是'HH:mm'格式,而不是'HH:mm aa' – Lega

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他開始。 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(); 

看到這個code run live at IdeOne.com

提示:在一段時間內使用時鐘時間格式會造成麻煩。歧義導致混淆和錯誤。我建議使用標準ISO 8601格式的持續時間,因爲它們被設計爲明確,易於閱讀和易於解析。

1

注很優雅,但你甚至不使用整數會做的工作

String pattern = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT) 
    .withLocale(locale).format(LocalTime.MIN) 
    .replaceFirst("\\d*", "H").replaceFirst("\\d.*", "mm"); 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern, locale); 
int minutes = formatter.parse(string).get(ChronoField.MINUTE_OF_DAY); 
相關問題