人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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」を格納したいと思います。

どのように記述すればよいか教えてください。
質問・疑問などがあればコメント欄にお願いします。

●質問者: にぎたま
●カテゴリ:コンピュータ
✍キーワード:00 2009年 9月11日 AM VBS
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● kn1967
●63ポイント ベストアンサー

【対応例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を利用するというような手もあります

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

知りませんでした。


2 ● chrono1742
●34ポイント

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

(参考)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) 'ロケールを戻す
◎質問者からの返答

ありがとうございます。

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

参考になりました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ