Все программы запускаются вызовами exec
, несмотря на реализации ОС, давайте посмотрим, что стандарт POSIX говорит о exec
функциях .
int execve (const char * path, char * const argv [], char * const envp []);
blockquote>
argv
являются аргументами, передаваемыми программе, [ 116] являются переменными среды.Каждый из массивов argv и environment заканчивается нулевым указателем. Нулевой указатель, завершающий массив argv, не учитывается в argc.
Аргумент argv является массивом символьных указателей на строки с нулевым символом в конце.
blockquote>Итак, очень легко сделать вывод:
- Пустая (нулевая длина) строка может быть передана в
argv
NULL
string can ' Если он не будет передан в argv, он прекратит работуargv
и отбросит все последующие аргументы.- любая строка в
argv
не может содержать символ\x0
,\x0
завершит текущую строку параметров.Объясните, что произошло при запуске
python -c 'print "\x30\x00\x31"' | xargs --null prog
Попробуйте:
python -c 'print "\x30\x00\x31"' | strace -f xargs --null echo
Мы можем найти:
... ... ... read(0, "0\0001\n", 4096) = 4 ... ... ... clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f09f46d9850) = 21232 strace: Process 21232 attached ... ... ... [pid 21232] execve("/bin/echo", ["echo", "0", "1\n"], 0x7ffe5ccd7638 /* 74 vars */
Это показывает, что
xargs
потенциально разделить аргумент, содержащий\x0
, на два аргумента при вызовеprog
. Не выполняется оболочкой, не выполняется ОС, libc, ноxargs
Если у вас уже есть объект DateTime
и вы хотите заменить время на 23:59:59 для этой данной даты, то вы можете использовать Свойство .Date
, чтобы получить дату со временем, установленным на 00:00:00, а затем добавить часы, минуты и секунды. Например:
var dt = yourDateInstance.Date.AddHours(23).AddMinutes(59).AddSeconds(59);
Если к последнему времени вы имеете в виду 23:59:59 PM, то это также должно работать:
var dt = new DateTime(Now.Year, Now.Month, Now.Day, 23, 59, 59);
DateTime startDate = DateTime.Today;
DateTime stopDate = startDate.AddDays(1).AddTicks(-1);
Как примечание, DateTime.Today
возвращает (из MSDN)
System.DateTime, установленный на сегодняшнюю дату, с компонентом времени, установленным в 00:00:00.
Как уже отмечали другие, добавьте день, затем вычтите наименьший квант времени (отметку), и вы получите последнее возможное время для текущего дня.
Конечно, вы можете нужно думать о часовых поясах и тому подобном, в зависимости от того, где выполняется код, а не от того, где находится пользователь. Время UTC может быть хорошим, но это может отнять у вас день (в любом случае) в зависимости от того, где работает ваш код.
На ваш вопрос уже дан ответ, но ИМХО лучший способ - не пытаться вычитать отметку, секунду или что-либо еще из конца диапазона и сравнивать, используя строго меньше, чем
Так что, если вы хотите, чтобы все даты в диапазоне включительно варьировались от startDate до endDate, игнорируя время, вы могли бы использовать следующее в C #:
if ((myDate >= startDate.Date) && (myDate < endDate.Date.AddDays(1)))
{
// ... it's in the range
}
или в T-SQL, предполагая, что ваш @ StartDate и @EndDate ровно в полночь, что-то вроде:
WHERE SomeDate >= @StartDate AND SomeDate < DATEADD(d,1,@EndDate)
UPDATE
Обновленный пример для отображения включающего диапазона в ответ на комментарии.
DateTime d = DateTime.Today.AddDays(1).AddTicks(-1);
Чтобы получить последний момент на сегодня:
DateTime d = new DateTime(Now.Year, Now.Month, Now.Day);
d = d.AddDays(1);
d = d.AddTicks(-1);
В ответ на ваши изменения я сделаю следующее:
DateTime start = new DateTime(Now.Year, Now.Month, Now.Day);
DateTime end = start.AddDays(1).AddTicks(-1);
// Or - just use end = start.AddDays(1), and use a < for comparison