2013-07-08 9 views
1

Я получаю смущение при разборе разницы во времени (которое я получаю с веб-страницы).Анализ Разница во времени

Для примера: Я получаю строку так: 2 years 10 weeks 3 days 6 hours 7 min ago. Обратите внимание, что конечный s в year, week, day и hour может отсутствовать в случае единства и не присутствовать в min.

В настоящее время я хочу получить разницу, сохраненную таким образом, и получить фактическую дату и время [путем вычитания из текущего времени?].

И, я смущен, что делать? Я знаю о методах разбора времени, но это не регулярное время, плюс есть то, что завершает s !!!

Может ли кто-нибудь предложить хороший подход к этому?

+0

Можете ли вы привести пример того, что вы хотите? возможно, попытка кода и где вы не уверены в продолжении? – Eluvatar

+0

'разделяем строку на пробелы и берем любой другой элемент. –

+0

@Eluvatar Я это понимаю. Но я совершенно смущен. Не знаю, с чего начать, чтобы получить такую ​​разницу. Поскольку, я использовал для разбора времени, не разница, так вот почему ... – Writwick

ответ

0

Я бы посоветовал рассчитать, сколько раз разница в миллисекундах, а затем вычесть из этого, что было бы просто, но вы столкнетесь с проблемой с високосными годами.

Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.YEAR, -2); 
cal.add(Calendar.WEEK_OF_YEAR, -10); 
cal.add(Calendar.DAY_OF_YEAR, -3); 
cal.add(Calendar.HOUR_OF_DAY, -6); 
cal.add(Calendar.MINUTE, -7); 

, который должен работать нормально, но я не тестировал его. вам также придется обрабатывать случаи, когда вы не получаете значение в течение нескольких недель, например.

+0

На самом деле расчеты не являются проблемой. Просто часть разбора - моя проблема. – Writwick

0

Вы можете использовать этот код. Это занимает около s s и возможное отсутствие некоторых токенов.

String orig = "2 years 10 weeks 3 days 6 hours 7 min ago"; 
String[] split = orig.replaceAll("[^0-9]+", " ").trim().split(" "); 
Calendar cal = Calendar.getInstance(); 
int idx = 0; 
if (orig.contains("yea")) cal.add(Calendar.YEAR, -Integer.parseInt(split[idx++])); 
if (orig.contains("wee")) cal.add(Calendar.WEEK_OF_MONTH, -Integer.parseInt(split[idx++])); 
if (orig.contains("day")) cal.add(Calendar.DATE, -Integer.parseInt(split[idx++])); 
if (orig.contains("hour")) cal.add(Calendar.HOUR, -Integer.parseInt(split[idx++])); 
if (orig.contains("min")) cal.add(Calendar.MINUTE, -Integer.parseInt(split[idx++])); 

SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss"); 
String formattedString = sdf.format(cal.getTime()); 
System.out.println(formattedString); // it prints 04-26-2011 02:12:54 
+0

это не работает. что, если это нулевые недели (недели, скорее всего, будут опущены), но 2 года, в этом случае годы будут введены в недели. – Eluvatar

+0

Я исправил проблему, снова посмотрю на код :) –

+0

Я бы использовал week_of_year вместо _of_month – njzk2

0

Используя @ предложение Eluvatar, в assumg пространство между каждой части:

Calendar cal = Calendar.getInstance(); 
String original = "2 years 10 weeks 3 days 6 hours 7 min ago"; 

// Split on whitespace separators ("\s+" means "one or more whitespace characters"), 
// having trimmed whitespace at beginning and end. 
String[] split = original.trim().split("\s+"); 

// Now parse each entry 
int num = split.length; 
int pos = 0; 
while ((num-pos) >= 2) { 
    if (split[pos].regionMatches(true, 0, "year", 0, 4)) { 
      cal.add(Calendar.YEAR, -Integer.decode(split[++pos])); 
    } 
    else if (split[pos].regionMatches(true, 0, "month", 0, 5)) { 
      cal.add(Calendar.MONTH, -Integer.decode(split[++pos])); 
    } 
    else if (split[pos].regionMatches(true, 0, "week", 0, 4)) { 
      cal.add(Calendar.WEEK_OF_YEAR, -Integer.decode(split[++pos])); 
    } 
    // And so on through the other potential values, note that the last 
    // number in regionMatches is the number of characters to match. 

    pos++; 
} 

"\ s +", возможно, должны стать "\ s +", см How do I split a string with any whitespace chars as delimiters?.

+0

Не используется ключевое слово 'month'. Я просто проверил это. Я могу изменить это, по моему удобству, хотя ... :) – Writwick

Смежные вопросы