Win XP, WSH, VBS で、文字列(日付)の操作について質問します。


「日/月/年 時間:分 午前/午後」という日付形式の文字列があります。たとえば、「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人2回まで
  • 登録:
  • 終了:2009/09/16 19:51:29
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント63pt

【対応例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にこだわらない方法ということで挙げてます。)

id:Nigitama

ありがとうございます。

上のスクリプトで実現できました。

>WSHからExcelVBAを利用するというような手もあります

そうだったんですね・・・

知りませんでした。

2009/09/16 19:48:38

その他の回答1件)

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301ここでベストアンサー

ポイント63pt

【対応例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にこだわらない方法ということで挙げてます。)

id:Nigitama

ありがとうございます。

上のスクリプトで実現できました。

>WSHからExcelVBAを利用するというような手もあります

そうだったんですね・・・

知りませんでした。

2009/09/16 19:48:38
id:chrono1742 No.2

回答回数91ベストアンサー獲得回数13

ポイント34pt

ロケールの一時的な変更で対応してみました。

(参考)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)          'ロケールを戻す
id:Nigitama

ありがとうございます。

こういう手もあるんですね。

参考になりました。

2009/09/16 19:50:34

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません