Как проверить, находится ли дата в данном диапазоне?

Я обнаружил, что изучение Java для большинства ООП наиболее полезно для изучения C #, поскольку они почти идентичны по библиотекам и синтаксису.

Знание C или C ++ становится полезным только после того, как вы углубитесь в C # в такие области, как неуправляемый код.

74
задан meleyal 10 June 2009 в 16:18
поделиться

6 ответов

Преобразование их в метки времени - это хороший способ, используя strtotime , например

$start_date = '2009-06-17';

$end_date = '2009-09-05';

$date_from_user = '2009-08-28';

check_in_range($start_date, $end_date, $date_from_user);


function check_in_range($start_date, $end_date, $date_from_user)
{
  // Convert to timestamp
  $start_ts = strtotime($start_date);
  $end_ts = strtotime($end_date);
  $user_ts = strtotime($date_from_user);

  // Check that user date is between start & end
  return (($user_ts >= $start_ts) && ($user_ts <= $end_ts));
}
110
ответ дан 24 November 2019 в 11:49
поделиться

Преобразуйте обе даты в метки времени, затем выполните псевдокод

:

if date_from_user > start_date && date_from_user < end_date
    return true
3
ответ дан 24 November 2019 в 11:49
поделиться
$startDatedt = strtotime($start_date)
$endDatedt = strtotime($end_date)
$usrDatedt = strtotime($date_from_user)

if( $usrDatedt >= $startDatedt && $usrDatedt <= $endDatedt)
{
   //..falls within range
}
4
ответ дан 24 November 2019 в 11:49
поделиться

Нет необходимости преобразовывать во временную метку для сравнения, поскольку строки проверяются как даты в каноническом формате «ГГГГ-ММ-ДД».

Этот тест будет работать:

( ( $date_from_user >= $start_date ) && ( $date_from_user <= $end_date ) )

задано:

$start_date     = '2009-06-17';
$end_date       = '2009-09-05';
$date_from_user = '2009-08-28';

ПРИМЕЧАНИЕ. Сравнение строк, подобных этой, позволяет использовать «недействительные» даты, например (32 декабря) «2009-13-32», и строки со странным форматом «2009/3/3», так что сравнение строк НЕ будет эквивалентно сравнению даты или отметки времени. Это работает ТОЛЬКО, если значения даты в строках находятся в формате CONSISTENT и CANONICAL .

EDIT , чтобы добавить здесь примечание, уточняя очевидное.

] Под CONSISTENT я имею в виду, например, что сравниваемые строки должны быть в одинаковом формате: месяц всегда должен состоять из двух символов, день всегда должен состоять из двух символов, а символ-разделитель всегда должен быть тире. Мы не можем надежно сравнить «строки», которые не являются четырехзначным годом, двухсимвольным месяцем и двухсимвольным днем. Если бы у нас было сочетание одного символа и двух символов месяцев в строках, например, мы получили бы неожиданный результат при сравнении, '2009-9-30' с '2009-10 -11 '. По-человечески мы видим, что «9» меньше «10», но при сравнении строк '2009-9' будет больше, чем '2009-1' . Нам не обязательно иметь символы-разделители тире; мы могли так же надежно сравнивать строки в формате 'ГГГГММДД' ; если есть символ-разделитель, он должен быть всегда и всегда одинаков.

Под CANONICAL я имею в виду формат, в результате которого строки будут отсортированы по дате. То есть в строке сначала будет отображаться «год», затем «месяц», а затем «день». Мы не можем надежно сравнивать строки в формате 'MM-DD-YYYY' , потому что это неканонично. Сравнение строк будет сравнивать MM (месяц) до сравнения YYYY (год), поскольку сравнение строк работает слева направо.) Большое преимущество 'YYYY-MM- Формат строки DD 'таков, что он канонический; даты, представленные в этом формате, можно надежно сравнивать в виде строк.

) Большим преимуществом строкового формата «ГГГГ-ММ-ДД» является его каноничность; даты, представленные в этом формате, можно надежно сравнивать в виде строк.

) Большим преимуществом строкового формата «ГГГГ-ММ-ДД» является его каноничность; даты, представленные в этом формате, можно надежно сравнивать в виде строк.

[ДОБАВЛЕНИЕ]

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

На некоторых платформах php не поддерживает значения метки времени до 01.01.1970 и / или позже 2038-01-19. (Это природа 32-битного целого числа временной метки unix.) Более поздние версии pf php (5.3?) Должны решить эту проблему.

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

HTH

47
ответ дан 24 November 2019 в 11:49
поделиться

Преобразуйте их в даты или целые числа отметок времени, а затем просто проверьте, что $ date_from_user равно <= $ end_date и> = $ start_date

2
ответ дан 24 November 2019 в 11:49
поделиться

Вы можете неявно преобразовать массив символов в LPCSTR без каких-либо преобразований:

void SomeFunction(LPCSTR aString);
...
char myArray[] = "hello, world!";
SomeFunction(myArray);

LPCSTR - это определение типа Windows для длинного указателя на постоянную строку. Еще в темные дни программирования Win16 были разные типы указателей: ближние указатели и дальние указатели, иногда также известные как короткие и длинные. указатели соответственно. Ближние указатели могли указывать только на сегмент памяти размером 64 КБ, определяемый одним из сегментных регистров x86. Далекие указатели могут указывать на что угодно. В настоящее время в Win32 с виртуальной памятью нет необходимости в ближних указателях - все указатели длинные.

Итак, LPSTR - это определение типа для char * , или указателя на строку. LPCSTR - это версия const , то есть это определение типа для const char * . В C массивы распадаются на указатели на свои первые элементы, поэтому char [] распадается на char * . Наконец, любой тип «указателя на T» (для любого типа T) может быть неявно преобразован в «указатель на const T». Таким образом, объединив эти три факта, мы видим, что мы можем неявно преобразовать char [] в LPCSTR .


В ответ на ваше изменение, я собираюсь предположить, что вы компилируете приложение Unicode. Если вы внимательно посмотрите документацию для CreateFile () , вы заметите, что параметр имени файла на самом деле является LPCTSTR , а не LPCSTR (обратите внимание на T ).

Практически для каждой функции Win32, которая принимает аргумент некоторого строкового типа (возможно, косвенно, то есть как член структуры, переданный в качестве параметра), на самом деле существует две версии этой функции: одна, которая принимает 8-битные строки ANSI, и другая, которая принимает 16-битные строки -символьные строки. Чтобы получить фактические имена функций, вы добавляете A или W к имени функции. Итак, ANSI-версия CreateFile () называется CreateFileA () , а версия для расширенных символов - CreateFileW () . В зависимости от того, компилируете ли вы с включенным Unicode (т.е.

3
ответ дан 24 November 2019 в 11:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: