获取经过的时间跨度的年、月、日 (DateTime)

2023-12-06

如何将日期时间选择器值中的年龄显示为年、月、日。例如:

Datetimepicker value = #1/11/2014#
Today = #1/12/2015#.  

最终结果将是“1 年,0 个月,1 天(S)”。但得到这个结果不仅仅是减去DateTime.Year价值观等。有人知道这方面的数学公式或数学计算吗?


这里有一个DateTimeSpan返回一个对象的类型,例如TimeSpan代表两个日期之间经过的年、月、日。它循环遍历时间单位以递增它们,直到较小的日期与较大的日期匹配。然后将所得增量返回到新的DateTimeSpan object.

Public Structure DateTimeSpan

    Private _Years As Integer
    Public ReadOnly Property Years As Integer
        Get
            Return _Years
        End Get
    End Property

    Private _Months As Integer
    Public ReadOnly Property Months As Integer
        Get
            Return _Months
        End Get
    End Property

    Private _Days As Integer
    Public ReadOnly Property Days As Integer
        Get
            Return _Days
        End Get
    End Property

    Private _Hours As Integer
    Public ReadOnly Property Hours As Integer
        Get
            Return _Hours
        End Get
    End Property

    Private _Minutes As Integer
    Public ReadOnly Property Minutes As Integer
        Get
            Return _Minutes
        End Get
    End Property

    Private _Seconds As Integer
    Public ReadOnly Property Seconds As Integer
        Get
            Return _Seconds
        End Get
    End Property

    Private _MilliSeconds As Integer
    Public ReadOnly Property MilliSeconds As Integer
        Get
            Return _MilliSeconds
        End Get
    End Property

    ' the ctor for the result
    Private Sub New(y As Integer, mm As Integer, d As Integer,
                    h As Integer, m As Integer, s As Integer,
                    ms As Integer)
        _Years = y
        _Months = mm
        _Days = d
        _Hours = h
        _Minutes = m
        _Seconds = Seconds
        _MilliSeconds = ms
    End Sub

    ' private time unit tracker when counting
    Private Enum Unit
        Year
        Month
        Day
        Complete
    End Enum

    Public Shared Function DateSpan(dt1 As DateTime, 
                                    dt2 As DateTime) As DateTimeSpan
        ' we dont do negatives
        If dt2 < dt1 Then
            Dim tmp = dt1
            dt1 = dt2
            dt2 = tmp
        End If

        Dim thisDT As DateTime = dt1
        Dim years As Integer = 0
        Dim months As Integer = 0
        Dim days As Integer = 0

        Dim level As Unit = Unit.Year
        Dim span As New DateTimeSpan()

        While level <> Unit.Complete
            Select Case level
                ' add a year until it is larger;
                ' then change the "level" to month
                Case Unit.Year
                    If thisDT.AddYears(years + 1) > dt2 Then
                        level = Unit.Month
                        thisDT = thisDT.AddYears(years)
                    Else
                        years += 1
                    End If

                Case Unit.Month
                    If thisDT.AddMonths(months + 1) > dt2 Then
                        level = Unit.Day
                        thisDT = thisDT.AddMonths(months)
                    Else
                        months += 1
                    End If

                Case Unit.Day
                    If thisDT.AddDays(days + 1) > dt2 Then
                        thisDT = thisDT.AddDays(days)
                        Dim thisTS = dt2 - thisDT
                        ' create a new DTS from the values caluclated
                        span = New DateTimeSpan(years, months, days, thisTS.Hours,
                                                thisTS.Minutes, thisTS.Seconds,
                                    thisTS.Milliseconds)
                        level = Unit.Complete
                    Else
                        days += 1
                    End If
            End Select
        End While

        Return span

    End Function

End Structure

Usage:

Dim dts As DateTimeSpan = DateTimeSpan.DateSpan(#2/11/2010#, #10/21/2013#)
Console.WriteLine("{0} Yrs, {1} Months and {2} Days",
                           dts.Years.ToString, dts.Months.ToString, dts.Days.ToString)

这将给出相同的结果:

Dim dtStart As DateTime = #2/11/2010#
Dim dtEnd As new DateTime(2013, 10, 21)
' this is NOT a date and wont work:
Dim myDt = "2/11/2010"             ' its a string!

Dim dts As DateTimeSpan = DateTimeSpan.DateSpan(dtEnd, dtStart)

Result: 3 Yrs, 8 Months and 10 Days

Notes:
- 它仅适用于正确的DateTime类型,而不是看起来像日期的字符串。使用文字 (#...#) or DateTime变量。当使用DateTimePicker, use .Value not .Text.
- 它不执行负值,因此传递值的顺序并不重要
- 计算时,它增加aDateTime变量所以,它应该正确考虑闰日

这是基于我很久以前在博客中找到的一些 C# 代码(或者甚至可能是来自 SO 答案或问题)。现在找不到引用原文。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取经过的时间跨度的年、月、日 (DateTime) 的相关文章

随机推荐

  • AWS Cloudformation 中 UserData 中的参考参数值

    我在参数部分有这个 Parameters PlatformSelect Description Cockpit platform Select Type String Default qa 1 AllowedValues qa 1 qa 2
  • 使用 javascript 播放以 Base64 编码的 .wav 声音文件

    我能够通过以下方式用 javascript 播放声音 var snd new Audio sound wav snd play 这会播放所需的声音 但有时加载速度很慢 甚至可能根本不加载 所以我用 Base 64 对声音进行编码并尝试以这种
  • 找不到添加到 xcode 7 的自定义字体的名称

    我在获取自定义字体的名称时遇到问题 我将字体添加到我的项目中 并选中 如果需要则复制 选项 我将字体名称添加到应用程序提供的 info plist 标签 Fonts 中 我将字体添加到复制捆绑资源中 该字体出现在自定义选项卡下的情节提要中
  • FileStore 4.2.1 分步示例

    我想要上传 csv 文件 验证它 然后上传到现有模型中 然而 我正在使用 ATK4 2 1 发现 google 搜索到的示例代码要么缺少一些步骤 要么与版本 4 2 1 不相关 为此 在我的第一步中 我尝试混合和匹配代码 试图让文件存储启动
  • mod_rewrite:删除尾部斜杠(只有一个!)

    我使用 mod rewrite htaccess 来获得漂亮的 URL 我使用此条件 规则来消除尾随斜杠 或者更确切地说 通过 301 重定向重写到非尾随斜杠 URL 我这样做是为了避免重复内容 因为我喜欢没有尾随斜杠的 URL更好的 Re
  • 为什么 Canvas API 在循环中使用错误的颜色填充这些路径的部分内容?

    我创建了一个JSFiddle所有代码均处于活动状态并正在运行 相关JS在这里 const canvas document getElementById base const ctx canvas getContext 2d const cW
  • Lambda 未加载加密共享库

    我正在使用 AWS Lambda 中的加密库 我已在 Amazon Linux VM 中使用 pip 编译了该包 我已将包作为图层上传 不管怎样 每次我调用库时 我都会遇到一个根本不具有描述性的错误 Unable to import mod
  • 如何在Python PyQt5中将变量分配给工作线程?

    我使用pyqt5设计了一个GUI程序 我有一个主线程和一个工作线程 当 GUI 启动时 我会从用户那里获得一些输入 例如年龄 姓名 并且我想在工作人员中处理这些输入 例如我如何发送我使用的输入self ui firstname text 给
  • Silverlight:从 silverlight 控件创建图像

    是否可以从 silverlight 控件生成图像 以便该控件将自身及其内容渲染到图像中 以便我可以对图像进行相同的像素操作 在 Silverlight 2 中无法实现此目的 我见过人们通过将 XAML 发布到服务器来解决此限制 该服务器将使
  • 如何在 C# 中反序列化包含可变数量对象的 json 对象并将它们作为键值集合?

    如何反序列化以下 JSON 对象并获取 Dictionary 的集合 其中键 字符串 应该是方法名称 对象是 C 中的详细信息 methods password 2 title Password CustomerID type passwo
  • 使用 iText 将标题添加到 pdf

    如何使用 iText 5 0 5 将页眉添加到每个 PDF 页面 这涵盖在 iText 实践 第二版第 5 章 代码示例均可在线免费获取 尤其电影国家1 and 电影史2两者都处理page页眉和页脚 归结为使用PdfPageEvent实现
  • 拼写错误:找不到合适的拼写检查程序

    虽然功能aspell标配utils包 它似乎不适合我 我不断收到同样的错误 aspell love Error in aspell love No suitable spell checker program found 有什么想法吗 gt
  • 使用 GAS AT&T 指令计算引导扇区的填充长度?

    所以我想在引导扇区添加填充 比方说 目前只有一个无限循环 jmp 该扇区的长度需要为 512 字节 还有 神奇的数字0xaa55需要在最后添加 jmp skip 508 0 word 0xaa55 但是 如果我想打印一些内容 但不想计算所有
  • 如何在iOS Reachability中检测网络信号强度

    我正在 iOS 中创建一个新的旅行应用程序 该应用程序高度依赖于地图 并且将包含两个地图 当用户有较强的网络信号时 我的第一个地图将起作用 Apple 地图 我的第二张地图将在没有任何网络或信号非常低时使用 离线 地图框 为什么一个应用程序
  • 处理上传的文本文件后在 Google 云端硬盘中创建新文档

    我成功地将文本文件上传到谷歌云端硬盘 并且编写了一种方法 可以成功地将文本翻译为猪拉丁语 现在我尝试在 Google Drive 中创建一个新文档来输出翻译后的文本 但是 我总是收到消息 发生错误 当我检查我的云端硬盘时 我只有原始上传的文
  • AccountManager:如何让用户使用对话框选择帐户

    在 AccountManager 教程中记住您的用户 建议 如果有多个Account在数组中 你应该呈现一个 对话框要求用户选择一个 最好的方法是什么 我心中有一个解决方案 但如果社区中有其他好的示例 那么这似乎是一种可以由其他人共享和轻松
  • 为什么 Android Studio 3.0.0 在 APK 上设置 FLAG_TEST_ONLY?

    我已经通过 3 0 0 rcX 来自 Canary 渠道 到达 Android Studio 3 0 0 来自稳定渠道 当我启动一个全新的应用程序并构建它时 以下代码 应用程序内部 显示设置了 FLAG TEST ONLY 标志 Log e
  • Python 中 Pivot 和 Transpose 的组合

    我正在做一些文本分析 并且有一个看起来像这样的数据 TABLE 1 C1 C2 C3 A1 TEXT1 ANOTHER TEXT1 A2 TEXT1 ANOTHER TEXT1 B1 TEXT2 ANOTHER TEXT1 B2 TEXT2
  • 从多个 csv 文件中删除标题

    我有多个csv每天来自不同服务器的文件 这些文件很大 超过 200 MB 我必须删除所有这些的标题csv文件 并使用批处理文件将它们替换为所需的列标题 下面的代码可以很好地仅从一个文件中删除列标题 echo off set csv mycs
  • 获取经过的时间跨度的年、月、日 (DateTime)

    如何将日期时间选择器值中的年龄显示为年 月 日 例如 Datetimepicker value 1 11 2014 Today 1 12 2015 最终结果将是 1 年 0 个月 1 天 S 但得到这个结果不仅仅是减去DateTime Ye