Помогите Изящный парсинг времени из строки

Статус
Закрыто для дальнейших ответов.

Spsiska_13

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
Yura2108
Есть варианты, как из строки типа 2h13m - получить время в миллисекундах, после конвертировать её в адекватный вид (Т.е. 120s = 2 минуты, а не 120 секунд). Причём вместо h и ему подобных могут быть русские аналоги или же цельные выражения (часов, час и т.д.).
Есть варианты? (Знаю про регулярки, но писать кучу не хочется, ради вариаций переменных h,m,s и т.д.)
 
Не так давно отвечал на подобное. Если не хочется каждый вариант прописывать в регулярке, можно просто указать [а-яa-z], и искать уже как-то так:
PHP:
private static final Pattern TIMES = Pattern.compile("(\d+)([a-zа-я])");

public static long parseTime(String timeStr) {
    Matcher matcher = TIMES.matcher(timeStr);
    long totalTime = 0;

    while(matcher.find()) {
        long digits = Long.parseLong(matcher.group(1));
        switch(matcher.group(2)) {
            case "y": case "years": case "г": case "года": case "л": case "лет":    digits *= 365;
            case "d": case "days": case "д": case "дней":                           digits *= 24;
            case "h": case "hours": case "ч": case "часов":                         digits *= 60;
            case "m": case "minute": case "м": case "минут":                        digits *= 60;
            case "s": case "секунд":                                                digits *= 1000;
            // case "ms": digits *= 1; Already calculating in MS
        }
        totalTime += digits;
    }

    return totalTime;
}
Конечно, более эффективным вариантом будет по-символьный парсинг, но и выглядеть он будет массивнее.
 
Используй unixtime и не ипи свой мозг. И потом парси его датаформатом. А еще можно будет вывести под часовой пояс игрока заюзав geoip.
 
Не так давно отвечал на подобное. Если не хочется каждый вариант прописывать в регулярке, можно просто указать [а-яa-z], и искать уже как-то так:
PHP:
private static final Pattern TIMES = Pattern.compile("(\d+)([a-zа-я])");

public static long parseTime(String timeStr) {
    Matcher matcher = TIMES.matcher(timeStr);
    long totalTime = 0;

    while(matcher.find()) {
        long digits = Long.parseLong(matcher.group(1));
        switch(matcher.group(2)) {
            case "y": case "years": case "г": case "года": case "л": case "лет":    digits *= 365;
            case "d": case "days": case "д": case "дней":                           digits *= 24;
            case "h": case "hours": case "ч": case "часов":                         digits *= 60;
            case "m": case "minute": case "м": case "минут":                        digits *= 60;
            case "s": case "секунд":                                                digits *= 1000;
            // case "ms": digits *= 1; Already calculating in MS
        }
        totalTime += digits;
    }

    return totalTime;
}
Конечно, более эффективным вариантом будет по-символьный парсинг, но и выглядеть он будет массивнее.
И в правду, не догадался так сделать, большое спасибо, вариант достаточно изящный с точки зрения внешнего вида кода)
Тема закрыта
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх