Просто используйте NSNumber
, и вы можете сделать:
@property (nonatomic, retain) NSNumber *movieId;
Если вас беспокоит только точность .Net ...
startDate = DateTime.ParseExact(dates[0], "yyyyMMdd");
endDate = DateTime.ParseExact(dates[1], "yyyyMMdd").AddTicks(-1).AddDays(1);
Вам действительно не нужно объединять дополнительные значения в строку для временной части.
В качестве дополнения, если вы используете это для запроса, например, к базе данных ...
startDate = DateTime.ParseExact(dates[0], "yyyyMMdd");
endDate = DateTime.ParseExact(dates[1], "yyyyMMdd").AddDays(1);
С запросом ...
WHERE "startDate" >= @startDate AND "endDate" < @endDate
Тогда проблемы точности, отмеченные в комментариях, не будут иметь большого значения. endDate в этом случае будет не частью диапазона, а внешней границей.
Объект DateTime
имеет свойство, называемое Date
, которое возвращает только часть даты. (Время по умолчанию установлено на 12:00).
Я бы порекомендовал в качестве более элегантного решения (ИМХО), что если вы хотите разрешить любое datetime в последний день, тогда вы добавляете 1 день к дате и сравниваете, чтобы разрешить времена больше или равные дате начала, но строго меньше даты окончания (плюс 1 день).
// Calling code. beginDateTime and endDateTime are already set.
// beginDateTime and endDateTime are inclusive.
// targetDateTime is the date you want to check.
beginDateTime = beginDateTime.Date;
endDateTime = endDateTime.Date.AddDays(1);
if ( beginDateTime <= targetDateTime &&
targetDateTime < endDateTime )
// Do something.
Вы можете определить два метода расширения где-нибудь в служебном классе, например:
public static DateTime EndOfDay(this DateTime date)
{
return new DateTime(date.Year, date.Month, date.Day, 23, 59, 59, 999);
}
public static DateTime StartOfDay(this DateTime date)
{
return new DateTime(date.Year, date.Month, date.Day, 0, 0, 0, 0);
}
И затем использовать их в таком коде:
public DoSomething()
{
DateTime endOfThisDay = DateTime.Now.EndOfDay();
}
That's pretty much what I would do, with some small tweaks (really no big deal, just nitpicking):
TryParse()
/TryParseExact()
methods should be used which return false
instead of throwing exceptions.FormatException
is more specific than Exception
ParseExact()
/TryParseExact()
will do this"00:00:00"
and "23:59:59"
are not neededtrue
/false
is you were able to parse, instead of throwing an exception (remember to check value returned from this method!)Code:
private bool ValidateDatePeriod(string pdr, out DateTime startDate,
out DateTime endDate)
{
string[] dates = pdr.Split('-');
if (dates.Length != 2)
{
return false;
}
// no need to check for Length == 8 because the following will do it anyway
// no need for "00:00:00" or "23:59:59" either, I prefer AddDays(1)
if(!DateTime.TryParseExact(dates[0], "yyyyMMdd", null, DateTimeStyles.None, out startDate))
return false;
if(!DateTime.TryParseExact(dates[1], "yyyyMMdd", null, DateTimeStyles.None, out endDate))
return false;
endDate = endDate.AddDays(1);
return true;
}