Использование NodaTime для datetimepicker

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

Потратив несколько часов на гугление, чтобы вычислить разницу между двумя датами, я наткнулся на здесь и здесь, где меня убедили использовать NodaTime, чтобы получить разницу в годах, месяцах и днях. Моему приложению требуется точность для расчета пенсии. Я использовал datetimepicker, чтобы получить значение даты из формы, а затем я использую Date.cs из здесь, чтобы извлечь дату в dd/mm/year, а затем вставить ее в базу данных. Чтобы вычесть две даты, используя Period.Between(date1, date2, PeriodUnits.Years).Years, как мне передать ему datetimepicker?

Вот что Джон Скит сказал: «Вы можете использовать LocalDateTime.FromDateTime, а затем использовать свойство Date, чтобы получить LocalDate».

Как мне полностью избавиться от времени при вставке в базу данных, а также найти разницу при использовании datetimepicker вместо Datetime.

Обновление:

//Date of appointment
var d_app = LocalDateTime.FromDateTime(dateTimePicker1.Value).Date;
//Date of retirement
var d_ret = LocalDateTime.FromDateTime(dateTimePicker2.Value).Date;
var years=Period.Between(d_app,d_ret,PeriodUnits.Years).Years;
var months = Period.Between(d_app, d_ret, PeriodUnits.Months).Months;
var days = Period.Between(d_app, d_ret, PeriodUnits.Days).Days;
MessageBox.Show(years.ToString()+" years"+months.ToString()+"months "+days.ToString()+"days");

Дав код datetimepicker1.value как 2/21/1990 (d_app) и datetimepicker2.value как 3/09/2015(d_ret), он вернул 25 yrs 300months 9147 days.

Что я делаю неправильно?


person yeung Leone    schedule 09.03.2015    source источник
comment
но это не работает, ничего не говорит нам о том, что вы видите, но это явно недействительный код, учитывая, что DateTime datetimepicker.Days.ToString даже немного недействителен в качестве аргумента метода. Также нет необходимости использовать этот другой код Date. Почему ты звонишь Days? Почему вы имеете в виду ToString?   -  person Jon Skeet    schedule 09.03.2015
comment
Обратите внимание, что использование @JonSkeet для вопроса, который я раньше не видел, ничего не делает, кстати.   -  person Jon Skeet    schedule 09.03.2015
comment
Похоже, вы просто хотите var dateOfBirth = LocalDateTime.FromDateTime(dateTimePicker.Value).Date;   -  person Jon Skeet    schedule 09.03.2015
comment
Извините, если вы возражаете против явного упоминания, но держу пари, вы знали ответ :) Использование Days.ToString было единственным значимым вариантом для цели, предоставленной Intellisense.   -  person yeung Leone    schedule 09.03.2015
comment
Вы меня неправильно поняли - я хочу сказать, что явное упоминание ничего не дало, потому что оно не было ответом на то, что я написал.   -  person Jon Skeet    schedule 09.03.2015
comment
Обновленный вопрос, пожалуйста!   -  person yeung Leone    schedule 09.03.2015
comment
Пожалуйста, в будущем уделяйте больше внимания форматированию кода. Это имеет огромное значение в читабельности.   -  person Jon Skeet    schedule 09.03.2015


Ответы (1)


Здесь вы выполняете три отдельных вычисления. Вам нужен только один:

var appointment = LocalDateTime.FromDateTime(dateTimePicker1.Value).Date;
var retirement = LocalDateTime.FromDateTime(dateTimePicker2.Value).Date;
var difference = Period.Between(appointment, retirement);
MessageBox.Show(string.Format("{0} years {1} months {2} days",
   difference.Years, difference.Months, difference.Days));
person Jon Skeet    schedule 09.03.2015
comment
Если не использовать Date.cs, смогу ли я получить mm/dd/year, используя NodaTime для вставки в базу данных? - person yeung Leone; 09.03.2015
comment
@CrystalHeart: неясно, что вы имеете в виду, но вы вообще не должны вставлять в базу данных с помощью strings. Вы, вероятно, захотите преобразовать обратно в DateTime и установить значение параметра в вашей команде SQL таким образом. - person Jon Skeet; 09.03.2015
comment
Что, если я не покажу time и вставлю в базу данных дату в виде строки для listview вещей? - person yeung Leone; 09.03.2015
comment
Что-то вроде Command.Parameters.Add("@appintment", SqlDbType.VarChar).Value = app_date.ToShortString();, где ToShortString подавали mm/dd/yyyy, взятое из Date.cs - person yeung Leone; 09.03.2015
comment
@CrystalHeart: я понятия не имею, что вы имеете в виду, но, по сути, если вы пытаетесь сохранить дату или значение даты/времени, вы должны отразить это в схеме базы данных и использовать соответствующий тип параметра при вставке. Почему вы используете varchar для представления даты? Это рецепт катастрофы. - person Jon Skeet; 09.03.2015
comment
Считаете ли вы важным, чтобы дата, время которой указано в listview для пользователя с appointment. Если нет, то как я могу вставить только дату в базу данных - person yeung Leone; 09.03.2015
comment
@CrystalHeart: Извините, ваши комментарии действительно не имеют для меня никакого смысла. Если вам нужна только дата в базе данных, используйте тип столбца Дата. Если вам нужны дата и время, используйте DateTime. Я не понимаю, как представления списка влияют на это решение. Похоже, вам, вероятно, следует задать новый вопрос, потому что мы сейчас далеко от вашего первоначального вопроса. - person Jon Skeet; 09.03.2015
comment
Использование столбца типа Date для вставки даты также добавляет 12:00 AM к каждой дате, от которой я хочу избавиться. Как бы вы избежали этого? - person yeung Leone; 12.03.2015
comment
@CrystalHeart: Что вы имеете в виду, добавляя 00:00 к каждой дате? Вы имеете в виду, когда вы получаете его как DateTime? Это просто потому, что DateTime не имеет представления о простом свидании. Чтобы избежать этого, вместо этого используйте LocalDate в Noda Time... - person Jon Skeet; 12.03.2015
comment
Не могли бы вы дать метод Noda Time, который форматирует время в мм/дд/гггг? - person yeung Leone; 12.03.2015
comment
@CrystalHeart: Вы читали руководство пользователя по форматированию текста? nodatime.org/1.3.x/userguide/text.html Затем посмотрите на LocalDatePattern - person Jon Skeet; 12.03.2015
comment
@CrystalHeart: Извините, я совсем не понимаю вашего комментария. Но на данный момент мы довольно далеки от вашего первоначального вопроса. Я предлагаю вам задать новый вопрос, если вы застряли - в комплекте с тем, что вы пробовали, и т. д. - person Jon Skeet; 12.03.2015
comment
Мне просто нужен был метод времени узла, чтобы заменить Date.cs, который анализирует дату в формате мм/дд/гггг. - person yeung Leone; 12.03.2015
comment
@CrystalHeart: Верно, так что это не то же самое, что и этот вопрос, который касается разницы в периодах вычислений, поэтому задайте новый вопрос после некоторых исследований. - person Jon Skeet; 12.03.2015