PERIANカレンダー日付文字列をDateTimeに変換する方法
質問
現在のDatetimeとマイナスITをTextBoxに入力する日付時間で、これらのコードを使用します。しかし、変換中にエラーが発生します。
PersianCalendar p = new System.Globalization.PersianCalendar();
DateTime date = new DateTime();
date = DateTime.Parse(DateTime.Now.ToShortDateString());
int year = p.GetYear(date);
int month = p.GetMonth(date);
int day = p.GetDayOfMonth(date);
string str = string.Format("{0}/{1}/{2}", year, month, day);
DateTime d1 = DateTime.Parse(str);
DateTime d2 = DateTime.Parse(textBox9.Text);
string s = (d2 - d1).ToString().Replace(".00:00:00", "");
textBox10.Text = (d2 - d1).ToString().Replace(".00:00:00","");
.
この行は、DateTimeを文字列から日付の時間に変換しながらエラーを合理化します。
この問題を解決するのを手伝ってください。
事前感あり
解決 4
私はその問題を解決しました。それは何ヶ月もの間例外のためでしたので、あなたが互いに2つの日付をマイナスしたいならば、あなたはグレゴリオ暦の両方に変換するべきであるならば、あなたはそれらをマイナスして結果を見ることができます。
ここにコード:
PersianCalendar p = new PersianCalendar();
string PersianDate1 = textBox1.Text;
string[] parts = PersianDate1.Split('/', '-');
DateTime dta1 = p.ToDateTime(Convert.ToInt32(parts[0]), Convert.ToInt32(parts[1]), Convert.ToInt32(parts[2]), 0, 0, 0, 0);
string PersianDate2 = textBox2.Text;
string[] parts2 = PersianDate2.Split('/', '-');
DateTime dta2 = p.ToDateTime(Convert.ToInt32(parts2[0]), Convert.ToInt32(parts2[1]), Convert.ToInt32(parts2[2]), 0, 0, 0, 0);
string s = (dta2 - dta1).ToString().Replace(".00:00:00", "");
textBox3.Text = s; // Show the result into the textbox
. 他のヒント
ここで日付を解析する必要はありません。
編集:
もともと私はこの回答でop処理のエラーを指摘したいだけでした。
しかし、私は完全な答えが良いと思います(遅れにもかかわらず)。
そして、中間の日付の表現がペルシャの日付のように見えないことを知っています。しかしそれは必要なものではありません。このコードは、現在の日付とユーザーが入る日付との間に適切な違いを与えます。
.string userInput = "1394/02/31";
System.DateTime date = System.DateTime.Today;
System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar();
int year = p.GetYear(date);
int month = p.GetMonth(date);
int day = p.GetDayOfMonth(date);
System.DateTime currentDate = new System.DateTime(year, month, 1);
currentDate = currentDate.AddDays(day - 1);
// validation omitted
System.String[] userDateParts = userInput.Split(new[] { "/" }, System.StringSplitOptions.None);
int userYear = int.Parse(userDateParts[0]);
int userMonth = int.Parse(userDateParts[1]);
int userDay = int.Parse(userDateParts[2]);
System.DateTime userDate = new System.DateTime(userYear, userMonth, 1);
userDate = userDate.AddDays(userDay - 1);
System.TimeSpan difference = currentDate.Subtract(userDate);
ToDateTime
クラスでPersianCalendar
メソッドを使用する:
PersianCalendar p = new PersianCalendar();
DateTime now = DateTime.Now;
DateTime dateT = p.ToDateTime(now.Year, now.Month, now.Day, 0, 0, 0, 0);
.
その形式で文字列を取得するには、
string str = dateT.ToShortDateString();
. あなたは、ユーザーがペルシャのカレンダー形式で入力された日付を解析する際に存在するようです。したがって、ユーザーが1391/2/31
を入力した場合は、それを解析できるようにします。今日(2012年5月19日)は1391/2/30
で、ついに1 day remaining
のようなものを表示したいです。
この質問には、がに尋ねられています。しかし、受け入れられた答えはちょうどを使おうとします
string persianDate = "1390/02/07";
CultureInfo persianCulture = new CultureInfo("fa-IR");
DateTime persianDateTime = DateTime.ParseExact(persianDate,
"yyyy/MM/dd", persianCulture);
.
1391/2/31
のような日付には機能しません。だから私はあなたが自分で解析を実装する必要があると思います。
エラーチェックを実装せずに、ユーザーが常に使用できるフォーマットのyyyy/mm/dd
を使用していると仮定します。
// Convert Persian Calendar date to regular DateTime
var persianDateMatch = System.Text.RegularExpressions.Regex.Match(
persianTargetTextBox.Text, @"^(\d+)/(\d+)/(\d+)$");
var year = int.Parse(persianDateMatch.Groups[1].Value);
var month = int.Parse(persianDateMatch.Groups[2].Value);
var day = int.Parse(persianDateMatch.Groups[3].Value);
var pc = new System.Globalization.PersianCalendar();
var target = pc.ToDateTime(year, month, day, 0, 0, 0, 0);
var difference = target - DateTime.Today;
differenceLabel.Text = difference.TotalDays.ToString("0");
.
正規表現が一致したことがあるかどうかを確認する必要があります。 pc.ToDateTime
がエラーをスローしないかどうかを確認する必要があります。残念ながら、ペルシャのカレンダーのDateTime.TryParse
のようなものは何も存在しないようです。
とにかく、今日のペルシャカレンダーに解析する必要はありません。
あなたはまた Farsi Library - 記事が非常に古い(2007)の日付、カレンダー、DatePickers の操作。
ここではあなたの友達のマニュアルがある場所です:
datetimeコンストラクタ(Int32、Int32、Int32、Calendar) < / P>
これはあなたが必要とする正確なコードです:
PersianCalendar p = new System.Globalization.PersianCalendar();
DateTime today = DateTime.Today;
DateTime pDate = new DateTime(p.GetYear(today), p.GetMonth(today), p.GetDayOfMonth(today), p);
DateTime d2 = DateTime.Parse(textBox9.Text);
// THIS NEEDS TO BE EXPLAINED
textBox10.Text = (d2 - pDate).ToString().Replace(".00:00:00","");
.
最終的には、あなたは何をしようとしていますか? textBox10
に期待している結果は何ですか? 2つの日付の間の日数を必要としている場合は、(d2 - pDate).ToString("d")
を実行してください。あなたがしようとしているのではなく、あなたがやろうとしていることを少し説明しようとしているのかもしれません、私たちはおそらくあなたをさらに助けることができます。
編集:ちょうどComecmeが言っていたことに気づきました。問題を引き起こすラインはここにあります:
DateTime d2 = DateTime.Parse(textBox9.Text);
.
代わりに、文化情報も使用するように変更する必要があります:
CultureInfo persianCulture = new CultureInfo("fa-IR");
DateTime d2 = DateTime.Parse(textBox9.Text, persianCulture)
.
編集:あなたは正しいですが、ペルシャの形式で日付を解析するだけではなく、特定のカレンダーに従って検証されません。これを正しく機能させるには、手動で日付を解析し、PersianCalendarが提供する新しい日時をインスタンス化する必要があります。
DateTime d2;
if(Regex.IsMatch(textBox9.Text, "^dddd/dd/dd$"))
{
d2 = new DateTime(
int.Parse(textBox9.Substring(0,4)),
int.Parse(textBox9.Substring(5, 2)),
int.Parse(textBox9.Substring(8, 2)),
p);
}
.
入力が指定した形式と間違いなく一致するだけであれば、それ以外の場合は、定義を正確に解析する方法はありません。
このコードを使用できます。
DateTime today = DateTime.Today; // excludes h/m/s
DateTime userdate = DateTime.Parse(textBox9.Text);
.
あなたが他のものから引いたものを一つずつあなたは時系列を得るならば。
TimeSpan diff = today - userDate;
.
この時間スパンのプロパティを使用して、好きな方法を表示できます。
変換フォーム/ペルシャカレンダーへの管理を管理するには、ここに良い解決策があります:
参考文献:
これは私が使っているコードです:
public DateTime ConvertPersianToEnglish(string persianDate)
{
string[] formats = { "yyyy/MM/dd", "yyyy/M/d", "yyyy/MM/d", "yyyy/M/dd" };
DateTime d1 = DateTime.ParseExact(persianDate, formats,
CultureInfo.CurrentCulture, DateTimeStyles.None);
PersianCalendar persian_date = new PersianCalendar();
DateTime dt = persian_date.ToDateTime(d1.Year, d1.Month, d1.Day, 0, 0, 0, 0, 0);
return dt;
}
. 以下の.NETライブラリを使用してPersianCalendarを使用することができます。
C# のPersian Calendar(PersiandateTime)
var persianDateTime = PersianDateTime.Now;
persianDateTime.EnglishNumber = true;
Console.Write(persianDateTime.ToString());
. このコードを試してください: このコードは、 "Grzegorz W"によって投稿された編集コードですが、ユーザー入力日付="1394/06/31"とエラーが "年、月、および日のパラメータの表現が表現不可能なDateTimeを表す" <"
下記のコードはOK:
string userInput = "1394/02/31";
System.DateTime date = System.DateTime.Today;
System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar();
int year = p.GetYear(date);
int month = p.GetMonth(date);
int day = p.GetDayOfMonth(date);
System.DateTime currentDate = new System.DateTime(year, month, day,p);
System.String[] userDateParts = userInput.Split(new[] { "/" }, System.StringSplitOptions.None);
int userYear = int.Parse(userDateParts[0]);
int userMonth = int.Parse(userDateParts[1]);
int userDay = int.Parse(userDateParts[2]);
System.DateTime userDate = new System.DateTime(userYear, userMonth, userDay,p);
System.TimeSpan difference = currentDate.Subtract(userDate);
.