在向两者添加相同的月份数后,DateTime实例的顺序会更改

时间:2017-08-02 07:26:34

标签: c# datetime

将18个月添加到两个日期(start < end)会更改订单。操作start > end之后:

var start = new DateTime(2017, 05, 30, 15, 30, 00);
var end =   new DateTime(2017, 05, 31, 09, 00, 00);

var newStart = start.AddMonths(18);
var newEnd = end.AddMonths(18);

Console.WriteLine(start < end);
Console.WriteLine(newStart < newEnd);

Console.WriteLine(newStart);
Console.WriteLine(newEnd);

提供以下输出:

True
False
11/30/2018 3:30:00 PM
11/30/2018 9:00:00 AM

添加不同的月份数(例如17)不会表现出相同的行为。哪种日期不规范是造成这种情况的?

https://dotnetfiddle.net/dCthCT

1 个答案:

答案 0 :(得分:2)

  

哪种日期违规行为是造成这种情况的?

在西部(罗马)日历中,有些月份有31天,有些月份只有30天(2月份是特殊的,只有28天,有时是29天)。

在您的示例中,您最终只能使用仅有30天的11月。所以从5月31日开始,我们不能去11月31日(不存在),所以BCL框架选择11月30日。然后从5月30日开始,我们也将到11月30日。

当日期组件相同时,我们会转到时间。这里选择“旧”值,以便在转到新值时相对顺序交换。

我认为没有任何其他有意义的方法可以实现AddMonths(int),以便您的要求“通过将相同的.AddMonths(n)应用于两个旧值而获得的两个新值的相对顺序应该是与旧值的相对顺序相同“,符合。

换句话说,如果您将<视为不等式(数学术语),则无法将.AddMonths(n)应用于<的两边,并获得等同于x的声明旧的。作为一项功能,“x.AddMonths(n)映射到AddMonths”不是单调的。

...

好吧,他们可以选择在下一个月的第一天午夜,在每种情况下天真x < y导致非 - 存在的日期。 (或选择那个瞬间减去一个 tick ,请参阅下面的Damien_The_Unbeliever的评论。)虽然它不能完全满足你的愿望,但它会满足一个微弱的增长标准:

  

如果x.AddMonths(n) <= y.AddMonths(n),那么x.AddMonths(n)(小于或等于)

这样价值永远不会交换,只会重合。

然而,微软没有选择那个。也许是因为他们认为xusing System; using Xamarin.Forms; namespace SwipeLib { public class SwipeListener : PanGestureRecognizer { private ISwipeCallBack mISwipeCallback; private double translatedX = 0, translatedY = 0; public SwipeListener(View view, ISwipeCallBack iSwipeCallBack) { mISwipeCallback = iSwipeCallBack; var panGesture = new PanGestureRecognizer(); panGesture.PanUpdated += OnPanUpdated; view.GestureRecognizers.Add(panGesture); } void OnPanUpdated(object sender, PanUpdatedEventArgs e) { View Content = (View)sender; switch (e.StatusType) { case GestureStatus.Running: try { translatedX = e.TotalX; translatedY = e.TotalY; } catch (Exception err) { System.Diagnostics.Debug.WriteLine("" + err.Message); } break; case GestureStatus.Completed: System.Diagnostics.Debug.WriteLine("translatedX : " + translatedX); System.Diagnostics.Debug.WriteLine("translatedY : " + translatedY); if (translatedX < 0 && Math.Abs(translatedX) > Math.Abs(translatedY)) { mISwipeCallback.onLeftSwipe(Content); } else if (translatedX > 0 && translatedX > Math.Abs(translatedY)) { mISwipeCallback.onRightSwipe(Content); } else if (translatedY < 0 && Math.Abs(translatedY) > Math.Abs(translatedX)) { mISwipeCallback.onTopSwipe(Content); } else if (translatedY > 0 && translatedY > Math.Abs(translatedX)) { mISwipeCallback.onBottomSwipe(Content); } else { mISwipeCallback.onNothingSwiped(Content); } break; } } } } 具有相同的时间组件更为重要。或许他们觉得他们的方式是最直观或最自然的?