「日/月/年 時間:分 午前/午後」という日付形式の文字列があります。たとえば、「2009年9月11日午前3時00分」の場合だと、「11/9/09 3:00 AM」です。この日付を基に、1分前と1分後の日付文字列(同じ形式)を生成したいと思います(次に例を示します)。
たとえば、「11/9/09 3:00 AM」が変数Date1に格納された場合、変数Date2には「11/9/09 2:59 AM」を、変数Date3には「11/9/09 3:01 AM」を格納したいと思います。
どのように記述すればよいか教えてください。
質問・疑問などがあればコメント欄にお願いします。
【対応例1】専用関数の自作
テキスト型から日付型への変換は日付フォーマットになってさえいれば、
DateAdd関数などの日付処理関数が使えて便利なのですが、
日付型からテキスト型への変換はFormatDateTime関数のみのため、
細かな制御を行おうとすれば、一度分解して再結合という方法を取らざるを得ず、
下記のように関数化する必要があったりします。
(使う場面が1度だけなら関数化しなくてもかまいませんが・・・。)
MSDN VBScriptユーザーズ ガイド/ランゲージ リファレンス
' 正規表現による置換関数 ' 日/月/年を年/月/日に置換しないと日付として扱えないため Function dtReplace(d) Dim r Set r = New RegExp r.pattern = "(\d+)/(\d+)/(\d+)" dtReplace = r.Replace(d, "$3/$2/$1") Set r = Nothing End Function ' 日付フォーマット関数 Function dtFormat(d) If Hour(d) > 12 Then dtFormat = Day(d) & "/" & Month(d) & "/" & Mid(Year(d), 3) & " " & _ (Hour(d) Mod 12) & ":" & Right("0" & Minute(d), 2) & " PM" Else dtFormat = Day(d) & "/" & Month(d) & "/" & Mid(Year(d), 3) & " " & _ Hour(d) & ":" & Right("0" & Minute(d), 2) & " AM" End If End Function ' 変数準備 Dim dt dt = dtReplace("11/9/09 3:00 PM") ' リテラルが日付型と認識できるものであれば日付関連の関数がそのまま使える。 WScript.Echo "1分前" & dtFormat(DateAdd("n", -1, dt)) WScript.Echo "1分後" & dtFormat(DateAdd("n", 1, dt))
【対応例2】汎用関数
「VBS 日付 フォーマット」等で検索すると汎用性を考えたスクリプトもありますので、
実は自らが作らなくても・・・。
【対応例3】他の環境を使う。
複雑な処理を行いたい場合は、例えば、Excelがインストールされている環境ならば、
WSHからExcelVBAを利用するというような手もあります。
(これは回答としては本題から、かなり外れますが、
VBScriptにこだわらない方法ということで挙げてます。)
【対応例1】専用関数の自作
テキスト型から日付型への変換は日付フォーマットになってさえいれば、
DateAdd関数などの日付処理関数が使えて便利なのですが、
日付型からテキスト型への変換はFormatDateTime関数のみのため、
細かな制御を行おうとすれば、一度分解して再結合という方法を取らざるを得ず、
下記のように関数化する必要があったりします。
(使う場面が1度だけなら関数化しなくてもかまいませんが・・・。)
MSDN VBScriptユーザーズ ガイド/ランゲージ リファレンス
' 正規表現による置換関数 ' 日/月/年を年/月/日に置換しないと日付として扱えないため Function dtReplace(d) Dim r Set r = New RegExp r.pattern = "(\d+)/(\d+)/(\d+)" dtReplace = r.Replace(d, "$3/$2/$1") Set r = Nothing End Function ' 日付フォーマット関数 Function dtFormat(d) If Hour(d) > 12 Then dtFormat = Day(d) & "/" & Month(d) & "/" & Mid(Year(d), 3) & " " & _ (Hour(d) Mod 12) & ":" & Right("0" & Minute(d), 2) & " PM" Else dtFormat = Day(d) & "/" & Month(d) & "/" & Mid(Year(d), 3) & " " & _ Hour(d) & ":" & Right("0" & Minute(d), 2) & " AM" End If End Function ' 変数準備 Dim dt dt = dtReplace("11/9/09 3:00 PM") ' リテラルが日付型と認識できるものであれば日付関連の関数がそのまま使える。 WScript.Echo "1分前" & dtFormat(DateAdd("n", -1, dt)) WScript.Echo "1分後" & dtFormat(DateAdd("n", 1, dt))
【対応例2】汎用関数
「VBS 日付 フォーマット」等で検索すると汎用性を考えたスクリプトもありますので、
実は自らが作らなくても・・・。
【対応例3】他の環境を使う。
複雑な処理を行いたい場合は、例えば、Excelがインストールされている環境ならば、
WSHからExcelVBAを利用するというような手もあります。
(これは回答としては本題から、かなり外れますが、
VBScriptにこだわらない方法ということで挙げてます。)
ありがとうございます。
上のスクリプトで実現できました。
>WSHからExcelVBAを利用するというような手もあります
そうだったんですね・・・
知りませんでした。
ロケールの一時的な変更で対応してみました。
(参考)http://www.kanaya440.com/contents/script/vbs/others/lcid.html
Option Explicit '日時をフォーマットする Function myFormatDateTime(tt) Dim hh, kk hh = Hour(tt) if (hh > 12) Then kk = "PM" hh = hh - 12 Else kk = "AM" End If myFormatDateTime = Day(tt) & "/" & Month(tt) & "/" & Right("00" & Year(tt), 2) & " " & hh & ":" & Right("0" & Minute(tt), 2) & " " & kk End Function Dim curloc, Date1, Date2, Date3 curloc = GetLocale 'ロケールを変更 SetLocale("en-gb") Date1 = "11/9/09 3:00 AM" Date2 = DateAdd("n", +1, Date1) '1分加算 Date3 = DateAdd("n", -1, Date1) '1分減算 MsgBox myFormatDateTime(Date1) & vbCrLf & myFormatDateTime(Date2) & vbCrLf & myFormatDateTime(Date3) SetLocale(curloc) 'ロケールを戻す
ありがとうございます。
こういう手もあるんですね。
参考になりました。
ありがとうございます。
上のスクリプトで実現できました。
>WSHからExcelVBAを利用するというような手もあります
そうだったんですね・・・
知りませんでした。