NodaTime usage for datetimepicker
为了避免出现重复的标签,这里有我所做的一切的简要总结。
在花了几个小时的时间谷歌来计算两个日期之间的差异后,我发现我在这里和这里,我被说服使用nodatime来计算年、月和天的差异。我的应用程序需要准确计算养老金。我使用datetimepicker从表中获取日期值,然后使用Date.cs从这里提取日期值。在dd/mm/year中输入日期,然后将其插入数据库。要用Period.Between(date1, date2, PeriodUnits.Years).Years减去这两个日期,我应该如何将datetimepicker传递给它?
这就是乔恩·斯基特所说的:"你可以使用LocalDateTime.FromDateTime,然后使用Date属性获得LocalDate"。
在数据库中插入时,我应该如何完全摆脱时间,以及在使用datetimepicker而不是Datetime时发现差异。
更新:
1 2 3 4 5 6 7 8
| //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和datetimepicker2.value作为3/09/2015返回25 yrs 300months 9147
days。
我做错什么了?
- "但它不起作用"并没有告诉我们您所看到的内容,但这显然是无效的代码,因为"datetime-datetimepicker.days.toString"作为方法参数甚至不太有效。也不需要使用其他Date代码。你为什么打电话给Days?你为什么指的是ToString?
- 请注意,用@jonsket回答我以前没见过的问题没有任何作用,顺便说一句。
- 看来你只是想要一个(3)
- 抱歉,如果你介意直截了当地提到,但我敢打赌你知道答案:)使用Days.ToString是IntelliSense提供的唯一有意义的选择。
- 你误解了我-我的观点是,直截了当的提及没有做任何事情,因为它没有回应我写的东西。
- 请更新问题!
- 请在以后对代码的格式化做更多的努力。它在可读性上有很大的不同。
您在这里执行三个单独的计算。您只需要一个:
1 2 3 4 5
| 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)); |
- 非常感谢你的正确选择!
- 不使用Date.cs,我能用NodaTime插入数据库吗?
- @CrystalHeart:不清楚你的意思,但你根本不应该使用字符串插入数据库。您可能希望转换回DateTime,并以这种方式在SQL命令中设置参数值。
- 如果我不显示time并将日期作为listview事物的字符串插入数据库,该怎么办?
- 类似于Command.Parameters.Add("@appintment", SqlDbType.VarChar).Value = app_date.ToShortString();,其中ToShortString服务于mm/dd/yyyy,取自Date.cs。
- @CrystalHeart:我不知道你的意思是什么,但从根本上说,如果你试图存储一个日期或日期/时间值,你应该让数据库模式反映出这一点,并在插入时使用适当类型的参数。为什么用varchar来表示日期?这是灾难的秘诀。
- 你认为在listview中指定的日期对使用appointment的用户很重要吗?如果没有,那么我如何在数据库中只插入日期呢?
- @克里斯托:对不起,你的评论对我真的没有任何意义。如果只需要数据库中的日期,请使用日期的列类型。如果需要日期和时间,请使用日期时间。我不知道列表视图是从哪里来的。听起来你应该问一个新问题,因为我们离你原来的问题还有很长的路要走。
- 使用Date类型的列插入日期,也会在我要删除的每个日期中添加一个12:00 AM。现在,如何避免这种情况?
- @Crystalheart:你说的"每个约会增加一个上午12点"是什么意思?你是说当你把它作为一个DateTime来取的时候?这仅仅是因为DateTime没有"只是约会"的概念。为了避免这种情况,在noda时间使用LocalDate。
- 你介意给一个noda-time的方法,它把时间格式化为"mm/dd/yyyy"吗?
- @CrystalHeart:你读过关于文本格式的用户指南吗?nodatime.org/1.3.x/userguide/text.html然后查看LocalDatePattern。
- 这几乎是一个新的C……的扭曲。
- @克里斯托:对不起,我完全不理解你的评论。但在这一点上,我们离你最初的问题还有很长的路要走。我建议你问一个新问题,如果你被卡住了-完成你的尝试,等等。
- 我只需要一个noda time方法来替换Date.cs,它以"mm/dd/yyyy"格式解析日期。
- @克里斯托:对,所以这和这个问题不一样,这个问题是关于计算周期差异的,所以在做了一些研究之后,问一个新的问题。