「みんな教えて! 選手権!!」開催のお知らせ

文字列で "令和7年1月05日 05時00分00秒" があります。
これを日付型の 2025/01/05 05:00:00 に変換したいのですが、
簡単なようで難しいです。

質問者からの補足コメント

  • どう思う?

    Dim warekiDate As String = "令和7年1月05日 05時00分00秒"
    Dim dt1 As DateTime = DateTime.Parse(warekiDate)
    MsgBox(dt1.ToString)

    これメッセージボックスは "2025/01/05 5:00:00" となるのですが、
    これで何の問題もないDateTimeでしょうか。

    No.1の回答に寄せられた補足コメントです。 補足日時:2025/01/05 21:10

A 回答 (2件)

横からすみません。


ANo.1 に対する補足についてお答えします。

補足にある結果は、真っ当なDateTime型の変数です。

しかし、何の問題もないかといったら一概にそうとは言い切れません。

(A)
Windowsにある地域設定が日本語(日本)だから問題がないのです。
例えば、地域設定が英語(米国)にすると、FormatExceptionを発生させます。
DateTime.Parse(String)は、既定のカルチャ情報を基に書式を解析してDateTimeにしようとするからです。
つまり、米国には和暦や年、月、日といった文字列の表現がないにも関わらず、日本固有の書式の文字列を解析しようとしてエラーとなります。

どんなWindows環境であってもエラーになることなく処理して欲しいなら、
下記のようにする必要があります。
Dim dt1 As DateTime = DateTime.Parse(warekiDate, New System.Globalization.CultureInfo("ja-JP"))

(B)
warekiDate が必ず誤りのない書式で来るのかも問題となります。
こちらも、認識不能な書式のものだとするとFormatExceptionを発生させます。
前ゼロの統一感がないことから、外部から渡ってくる情報を制御しようとしているように見受けられます。
原則アプリケーションを作り上げる時、自アプリケーションの動作の信頼性を担保するために、自アプリケーション外から受け取る情報は、誤った情報が届くことを前提として組み立てます。


これらをどのように制御するかは所属する団体やプロジェクトが有するアプリケーション開発のポリシーに従えばよいと思います。
恐らくほとんどの場合、下記のような方法を取るでしょう。

1.
(A)の方法によって、必ず日本語扱いした制御とする。
ただし、誤った書式は例外として捕捉する。
Dim warekiDate As String = "令和7年1月05日 05時00分00秒"

Try
Dim dt1 As DateTime = DateTime.Parse(warekiDate, New System.Globalization.CultureInfo("ja-JP"))
Console.WriteLine(dt1.ToString())

Catch ex As FormatException
' 書式変換できなかった時の処理
Console.WriteLine(ex.Message)
End Try

Console.ReadLine()

2.
DateTime.TryParse()を利用して、変換の妥当性を判定して処理を行う。
日本語以外のカルチャ環境のOSではアプリケーションを正しく動作させることはできない。
Dim warekiDate As String = "令和7年1月05日 05時00分00秒"
Dim dt1 As DateTime
If Not DateTime.TryParse(warekiDate, dt1) Then
' 書式変換できなかった時の処理
Return
End If

Console.WriteLine(dt1.ToString())


作成するアプリケーションを取り巻く環境を考慮の上で検討し、方法を決定するとよいでしょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。参考になります。

お礼日時:2025/01/07 18:33

https://learn.microsoft.com/ja-jp/dotnet/api/sys …
上記メソッドでだいたい可能ですが、変則的な入力文字列がくる場合は先に正規表現を駆使する等の前処理を追加すると良いです。

> type a.vb
Imports System
Public Class Test
Public Shared Sub Main()
Console.WriteLine( DateTime.Parse( "令和7年1月05日 15時20分01秒" ) )
End Sub
End Class
> C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc.exe a.vb
Microsoft (R) Visual Basic Compiler version 14.8.9256
for Visual Basic 2012
Copyright (c) Microsoft Corporation. All rights reserved.

This compiler is provided as part of the Microsoft (R) .NET Framework, but only supports language versions up to Visual Basic 2012, which is no longer the latest version. For compilers that support newer versions of the Visual Basic programming language, see http://go.microsoft.com/fwlink/?LinkID=533241

> .\a.exe
2025/01/05 15:20:01
>
この回答への補足あり
    • good
    • 0
この回答へのお礼

すみません、C#は良く分からないのでVBでお願いします。

お礼日時:2025/01/05 21:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A