質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

1567閲覧

【VB.NET】様々な日付形式の文字列に、その日付形式に対応した「時間と分」(例00時00分)を追加して出力したいです。

PotePui

総合スコア69

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2019/01/13 15:06

お世話になります。

まず結論から言って、下記の"2019年01月01日 18時28分"の形式の表示にしたいです。

VB.NET

1Dim stLastExecDate as string = "2019年01月01日 18時28分"

上記形式にしたいのは、下記文字列の4パターンです。

  1. 2019年01月01日
  2. 2012/2/1
  3. 1-Feb-12
  4. 2012-02-01

つまり、どのパターンで入力しても、(日付は何日でもよい)
正規表現でいうと、
"\d{4}年\d\d月\d\d日\s\d\d時\d\d分"
の形式にOutPutされれば問題ないです。

今の現状として、
エクセルのB2セルに
stLastExecDate となる 値、"2019年01月01日 18時28分"が入力されています。

これをVisualStudioでもいいのですが、
上記1~4の時間部分を除く日付までの入力で、あとは自動で"00時00分"が
加わればよいです。
1から4は日付の形式が米国のものもあるので、時間は米国に合わせます。

String.Containsで("-")や("/")などが含まれているとき別に、
条件分岐をして
String.replace()もしくはString.insert()などを使用すれば実装できるかなと思っていますが、

正規表現を使えばもっと簡単にできるよというのがあれば、知りたくてご質問いたしました。

Imports System Imports System.Text.RegularExpressions Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim stLastExecDate As String = "2081年01月03日 18時00分" Dim stTestStr As String = "2000-01-03" 'Dim result As Boolean = Regex.IsMatch(stLastExecDate, "\d{4}年\d{2}月\d\d日\s\d\d時\d\d分") 'Dim test As Boolean = Regex.IsMatch(stTestStr, "\d{4}.\d\d.\d\d") 'Console.WriteLine(result) 'Console.WriteLine(test) 'stTestStr.Insert(10, "8") Console.WriteLine(stTestStr + " 00時00分") End Sub End Class

上記は、このような感じでできるかなと思って記載しています。
何かご不明な点がありましたら、ご質問ください。

ご教示よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

下記にて提示されたフォーマットの変換はできます。
但し、指定されたフォーマット以外でも変換できます。(1-Feb-2012等)

VB.NET

1Dim teststring As String() = {"2019年01月01日", "2012/2/1", "1-Feb-12", "2012-02-01"} 2Dim OutputDate As DateTime 3 4Dim ci As New Globalization.CultureInfo("en-US") 5 6For Each test In teststring 7 If DateTime.TryParse(test, ci, Globalization.DateTimeStyles.NoCurrentDateDefault, OutputDate) Then 8 Console.WriteLine($"{test} = {OutputDate:yyyy年MM月dd日 HH時mm分}") 9 End If 10Next 11

厳密に行いたいのであれば、DateTime.TryParseExactメソッドを使用して

VB.NET

1Dim Formats As String() = {"yyyy年MM月dd日", "yyyy/M/d", "d-MMM-yy", "yyyy-MM-dd"} 2 3If DateTime.TryParseExact(test, Formats , Globalization.DateTimeFormatInfo.InvariantInfo,Globalization.DateTimeStyles.None, OutputDate) Then 4 Console.WriteLine($"{test} = {OutputDate:yyyy年MM月dd日 HH時mm分}") 5End If

とすればどうでしょうか

投稿2019/01/13 17:04

編集2019/01/13 17:18
YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PotePui

2019/01/14 04:43

早速のご回答ありがとうございます。 こちらでも試してみました! 自分が求めていたのは、まさにこういう感じでした。 ただ、僕の言葉が足りなかったのですが、 Dim stLastExecDate As String() = {"20000102", "2009年01月07日", "2012/2/1", "1-Feb-12", "2012-02-01"} Dim Formats As String() = {"yyyyMMdd", "yyyy年MM月dd日", "yyyy/M/d", "d-MMM-yy", "yyyy-MM-dd"} Dim OutputDate As DateTime Dim ci As New Globalization.CultureInfo("en-US") For Each dtmDate In stLastExecDate If DateTime.TryParseExact(dtmDate, Formats, Globalization.DateTimeFormatInfo.InvariantInfo, Globalization.DateTimeStyles.None, OutputDate) Then Console.WriteLine($"{dtmDate} = {OutputDate:yyyy年MM月dd日 HH時mm分}") End If Next 上記コードでいう、1行目の配列でループをされていたのですが、 Dim stLastExecDate As String() = {"20000102", "2009年01月07日", "2012/2/1", "1-Feb-12", "2012-02-01"} 実際には、エクセルを初期パラメータとして読み込み、stLastExecDateに値を代入しています。 そのため、配列ではなくて実際にstLastExecDateの変数に入る値は一つでString型になります。 このString型の変数に、 下記の Dim Formats As String() = {"yyyyMMdd", "yyyy年MM月dd日", "yyyy/M/d", "d-MMM-yy", "yyyy-MM-dd"} FormatsのString型の配列のどの形式が入力されても、最終的に yyyy年MM月dd日 hh時mm分の形式で、その値をString型変数に代入できればよいので、 ご回答いただきました内容で、ほぼ出力内容は完璧なのですが、 配列ではなくて、一つの変数に最終的に代入させたいです。 勉強不足なところがあり、申し訳ございません。 お手数おかけいたしますが、 ご教示いただけますと幸いです。 お忙しい中、お返事いただきありがとうございます。
YAmaGNZ

2019/01/14 04:58

ループにしたのは、あくまで提示された例を全部変換かけようと用意しただけです。 本質はループの中身だけです。 リンクを張ったTryParseExactメソッドのページを見ていただければ分かるかと思いますが、TryParseExactメソッドの第一引数は変換させる文字列です。 ですので、この部分に変換したい文字列が格納されている変数を指定すればよろしいかと
PotePui

2019/01/14 10:18

ありがとうございます。 Dim stLastExecDate As String = "2019-01-14" Dim Formats As String() = {"yyyyMMdd", "yyyy年MM月dd日", "yyyy/M/d", "d-MMM-y", "yyyy-MM-dd", "dd/MM/yyyy", "yy/MM/dd", "yy-MM-dd", "yy年MM月dd日"} Dim ci As New System.Globalization.CultureInfo("en-US") Dim OutputDate As DateTime Dim OutputExecDate As String If DateTime.TryParseExact(stLastExecDate, Formats, System.Globalization.DateTimeFormatInfo.InvariantInfo, System.Globalization.DateTimeStyles.None, OutputDate) Then OutputExecDate = $"{OutputDate:yyyy年MM月dd日 HH時mm分}" Console.WriteLine(OutputExecDate) End If 上記コードのような形にして、 期待通りの結果が得られました。 あとは、FormatsのPatternをこちらで制限して、 入力形式をある程度絞ります。 ありがとうございます。大変助かりました!
YAmaGNZ

2019/01/14 10:55

CultureInfoはTryParseの時に必要だったので書いてあります。 TryParseExactではDateTimeFormatInfo.InvariantInfoを指定しているので、CultureInfo("en-US")は必要ありません。
PotePui

2019/01/14 12:42 編集

はい、そこは実際のコードを記載時、 コードを再度入力していたとき("en-US")のところは、TryParseの時に引数で使用していたけど、 TryParseExactでは使用してないと気づきました。 丁寧にご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問