LINUX.ORG.RU

дата в произвольном формате

если формат конкретной строки неизвестен то задача не разрешима, например потому что у американцев например месяц-число-год

Deleted
()
Ответ на: комментарий от MyTrooName

Врёшь! ж)

  • 1 Jan 2003 (или 1903?)
  • 2 Feb 2003
  • 2 Feb 2003
  • 3 Feb 2001
  • ...

В любом случае мой libastral сбоит.

beastie ★★★★★
()
Ответ на: комментарий от Deleted

как ты отличишь дату разбираемую маской dd/mm/yy от mm/dd/yy ?

в маске ведь уже задано, что день - два числа(слеш)два числа месяца(слеш)два сисла года. Извлекать соответствующие числа, проверять на валидность и возвращать. Не?

Crow
() автор топика
Ответ на: комментарий от dmiceman

как ты отличишь дату разбираемую маской dd/mm/yy от mm/dd/yy ?

Спасибо, посмотрю.

Crow
() автор топика
Ответ на: комментарий от Deleted

ну и попалось тебе 10/10/2014 какую маску юзать?

Вот тут уже хез, на автомате это как пальцем в небо будет.

Crow
() автор топика
Ответ на: комментарий от Deleted

10/10/2014

Тут непонятно же, то ли 10 октября 2014 года, то ли 10 октября 2014 года. А-а-а, какой же вариант выбрать?

i-rinat ★★★★★
()
Ответ на: комментарий от Deleted

пусть самообучается на ошибках тогда «гипотеза не верна, переходим к следующей маске» xD

anonymous
()

строка даты в общем случае содержит 3 числа и разделители число длиной 4 цифры — всегда год

алгоритм будет такой: парсится первое число. вариант а) если оно состоит из 4 цифр, то следующее число — обозначает месяц, а 3-е чило — день. вариант б) если оно состоит из 2 цифр, то оно обозначает день, следующее число обозначает месяц, а 3-е — год.

далее проверки. если хотя бы одно из чисел состоит из трёх цифр, значит это не дата. если между цифрами больше 3-х разделителей (любой нецифровой символ принимается за разделитель), значит это не дата. если напарсилось только 2 числа, значит — это не дата. Если одно, но число цифр в нём не равно 6 или 8 — значит это не дата, в противном случае первые пары цифр == число и месяц соответственно, последние цифры означают год.

после того год, месяц и число будут определены, проверить валидность даты. если неверная, поменять число и месяц местами, если снова не верная, значит — ошибка. далее, если год < 100, то год += 2000.

собственно, всё. данный алгоритм верно покрывает 90% случаев. если надо выцепить хоть какие-то данные, а ошибки не критичны, то он вам подойдёт.

время парсится аналогично, только там даже попроще будет

next_time ★★★★★
()
Последнее исправление: next_time (всего исправлений: 1)

Посмотри исходники date

Он конечно не всё может, но

$ date -d "next monday 6 p.m."
Mon Oct 27 18:00:00 MSK 2014

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.