1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Spsiska_13, 10 май 2021.

Статус темы:
Закрыта.
  1. Автор темы
    Spsiska_13

    Spsiska_13 Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Yura2108
    Есть варианты, как из строки типа 2h13m - получить время в миллисекундах, после конвертировать её в адекватный вид (Т.е. 120s = 2 минуты, а не 120 секунд). Причём вместо h и ему подобных могут быть русские аналоги или же цельные выражения (часов, час и т.д.).
    Есть варианты? (Знаю про регулярки, но писать кучу не хочется, ради вариаций переменных h,m,s и т.д.)
     
  2. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Не так давно отвечал на подобное. Если не хочется каждый вариант прописывать в регулярке, можно просто указать [а-я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;
    }
    Конечно, более эффективным вариантом будет по-символьный парсинг, но и выглядеть он будет массивнее.
     
  3. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Используй unixtime и не ипи свой мозг. И потом парси его датаформатом. А еще можно будет вывести под часовой пояс игрока заюзав geoip.
     
  4. Автор темы
    Spsiska_13

    Spsiska_13 Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Yura2108
    И в правду, не догадался так сделать, большое спасибо, вариант достаточно изящный с точки зрения внешнего вида кода)
    Тема закрыта
     
Статус темы:
Закрыта.

Поделиться этой страницей