C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 和暦表示


(過去ログ 52 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■28943 / inTopicNo.1)  和暦表示
  
□投稿者/ ちん (1回)-(2008/12/02(Tue) 21:14:44)

分類:[VB.NET/VB2005 以降] 

vb2005を使っています。
sp1です。

和暦変換をしたくてサイトを調べていたんですが、解らなくて質問させてください。

日付に変換してToStringを使っているのですが、「平成10年10月10日」はできた
のですが、「H10年10月10日」にする方法がわかりません。

ToStringの引数は"gy年M月d日"にしています。

「H10年10月10日」に変換する方法を教えていただけないでしょうか?
引用返信 編集キー/
■28949 / inTopicNo.2)  Re[1]: 和暦表示
□投稿者/ やじゅ (821回)-(2008/12/02(Tue) 22:26:38)
やじゅ さんの Web サイト
No28943 (ちん さん) に返信
> 「H10年10月10日」に変換する方法を教えていただけないでしょうか?

6."H16/08/05" のように変換する例
http://homepage1.nifty.com/rucio/main/dotnet/Samples/dnSampleDateToString.htm
引用返信 編集キー/
■28952 / inTopicNo.3)  Re[1]: 和暦表示
□投稿者/ 魔界の仮面弁士 (924回)-(2008/12/02(Tue) 22:49:50)
2008/12/02(Tue) 22:56:35 編集(投稿者)

No28943 (ちん さん) に返信
> 和暦変換をしたくてサイトを調べていたんですが、

簡単なのは、"Microsoft.VisualBasic.Compatibility" を参照設定して、
 'Imports Microsoft.VisualBasic.Compatibility.VB6
 Dim s As String = Support.Format(dt, "gee年MM月dd日")
かな。

-----
追記修正。上記だと、Format 関数等が競合してしまうので、

 'Imports Microsoft.VisualBasic.Compatibility
 Dim s As String = VB6.Format(dt, "gee年MM月dd日")

の方が良いかも。
-----


追加の参照設定無しで行うとなると、下記のように長いコードに…。

'Imports System.Globalization

Function ToShortWareki(ByVal dt As Date) As String
  Dim jc As New JapaneseCalendar()
  Dim ci As New CultureInfo("ja-JP", True)
  ci.DateTimeFormat.Calendar = jc
  If dt < jc.MinSupportedDateTime OrElse dt > jc.MaxSupportedDateTime Then
    Return dt.ToString("yyyy年MM月dd日", New CultureInfo("ja-JP", True))
  Else
    Return "MTSH"(jc.GetEra(dt) - 1) & dt.ToString("yy年MM月dd日", ci)
  End If
End Function

Function ToLongWareki(ByVal dt As Date) As String
  Dim jc As New JapaneseCalendar()
  Dim ci As New CultureInfo("ja-JP", True)
  ci.DateTimeFormat.Calendar = jc
  If dt < jc.MinSupportedDateTime OrElse dt > jc.MaxSupportedDateTime Then
    Return dt.ToString("yyyy年MM月dd日", New CultureInfo("ja-JP", True))
  Else
    If jc.GetYear(dt) = 1 Then
      Return dt.ToString("gg元年MM月dd日", ci)
    Else
      Return dt.ToString("ggyy年MM月dd日", ci)
    End If
  End If
End Function

実際に使う際は、作成するアプリの仕様に応じて、MM 書式と M 書式の
どちらにするのか、「元年」の表記を行うかどうかなどの修正が必要かも。
引用返信 編集キー/
■28956 / inTopicNo.4)  Re[2]: 和暦表示
□投稿者/ 魔界の仮面弁士 (925回)-(2008/12/02(Tue) 23:45:17)
2008/12/03(Wed) 00:01:22 編集(投稿者)

# AllocCoTaskMem サイズ修正

No28952 (魔界の仮面弁士) に返信

ネタとして、あえて COM API を使ってみたり。

'Imports System.Runtime.InteropServices
Declare Unicode Function VarFormat Lib "oleaut32" _
 (ByVal pvariant As IntPtr, _
  <MarshalAs(UnmanagedType.VBByRefStr)> ByRef sFmt As String, _
  ByVal dow As Integer, _
  ByVal woy As Integer, _
  ByVal dwFlags As Integer, _
  <MarshalAs(UnmanagedType.BStr)> ByRef sb As String) As Integer

Function ToWareki(ByVal dt As Date) As String
 ''Variant の Date 型って、8 バイトで良かったっけか?
 'Dim pObj As IntPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(dt.ToOADate()))

 'VARIANT 構造体の定義は、vt が 2, reserved1〜3 が 6, data1 が 4
 'data2 が 4 バイトとして…合計 16 バイトで良いのかな。
 'VB6 のヘルプを見ると、「日付型 (Date)」は 8 バイトで、
 '「バリアント型 (数値)」は 16 バイトと書いてあったけど…。
 Dim pObj As IntPtr = Marshal.AllocCoTaskMem(16)

 Marshal.GetNativeVariantForObject(dt, pObj)

 Dim fmt As String = "gee年MM月dd日"
 Dim result As String = String.Empty
 Const VAR_FORMAT_NOSUBSTITUTE As Integer = 0
 Dim ret As Integer = VarFormat(pObj, fmt, vbSunday, vbFirstJan1, VAR_FORMAT_NOSUBSTITUTE, result)
 Marshal.FreeCoTaskMem(pObj)

 Return result
End Function
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -