2

VB2012: レガシー システムからデータを読み取っています。フィールドの 1 つは時間であり、それを DateTime 変数に読み込んでいます。「hhmmt」形式を使用して、DateTime.ParseExact で日付を解析します。私が抱えている唯一の問題は、従来のシステムが午前の場合は A、午後の場合は P を表示し、正午の場合は N の特別なケースを表示することです。.NET は N 指定子を好まないので、それを検出して P に変更します。

003 0300 AAABBB  845A 1200N
005 1400 CCCDDD 1055A  240P
007 7000 EEEFFF  306P  531P

ここで、いくつかの処理を行い、データをファイルに出力します。レガシーシステムで印刷されている形式で時刻を印刷したい。私の最初の考えは、カスタム DateTimeFormatInfo を使用することでした

Dim info As New DateTimeFormatInfo
info.PMDesignator = "N"

それを IFormatProvider として文字列フォーマッタにフィードします

trip.ArriveTime.ToString("hmmt", info)

しかし、DateTimeFormatInfo の設定は静的であり、時刻が 12:00P または正午の場合は役に立たないことを認識しています。このユニークなシナリオを説明し、正午には N サフィックスを使用し、それ以外の時間には標準の A を AM に、P を PM に維持する形式を作成する方法はありますか?

可能な解決策で更新します。

Imports System.Text.RegularExpressions
Imports System.Globalization

Module mdlExtensions
    Private rgxTimePeriod As New Regex("t+")
    <System.Runtime.CompilerServices.Extension()> _
    Public Function LegacyFormat(dt As DateTime, fmt As String, Optional provider As IFormatProvider = Nothing) As String
        Dim formatted As String
        If dt.TimeOfDay = New TimeSpan(12, 0, 0) Then
            fmt = rgxTimePeriod.Replace(fmt, "N")
        End If
        If provider Is Nothing Then
            formatted = dt.ToString(fmt)
        Else
            formatted = dt.ToString(fmt, provider)
        End If

        Return formatted
    End Function

    <System.Runtime.CompilerServices.Extension()> _
    Public Function ToLegacy(dt As DateTime, fmt As String, Optional provider As IFormatProvider = Nothing) As String
        'setup the master DateTimeFormatInfo
        Dim ci As CultureInfo = CType(provider, CultureInfo)
        Dim mstrDtfi As DateTimeFormatInfo
        If provider Is Nothing Then
            'designate a new DateTimeFormatInfo class if Nothing was passed in
            mstrDtfi = New DateTimeFormatInfo
        Else
            'get a reference to the DateTimeFormatInfo class of the FormatProvider that was passed in
            mstrDtfi = ci.DateTimeFormat
        End If

        'check to see if the time is noon and set a new PMDesignator if it is
        If dt.TimeOfDay = New TimeSpan(12, 0, 0) Then
            mstrDtfi.PMDesignator = "NN"
        End If

        'check to see if the time is midnight and set a new AMDesignator if it is
        If dt.TimeOfDay = New TimeSpan(0, 0, 0) Then
            mstrDtfi.AMDesignator = "MM"
        End If

        'now format the date string with the proper provider 
        Dim formattedDate As String
        If provider Is Nothing Then
            formattedDate = dt.ToString(fmt, mstrDtfi)
        Else
            formattedDate = dt.ToString(fmt, ci)
        End If

        Return formattedDate
    End Function

End Module
4

1 に答える 1