17

我使用这些代码来转换当前日期时间并减去用户在文本框中键入的日期时间。但是在转换时会出错。

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 从 string 转换为 date time 时,此行将报错:DateTime d1 = DateTime.Parse(str);

请帮我解决这个问题。

提前致谢

4

14 回答 14

15

无需在这里解析日期。

编辑:

最初我只想用这个答案指出 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);
于 2012-05-18T15:16:30.213 回答
14

您的实际问题似乎在于解析用户以波斯日历格式输入的日期。因此,如果用户输入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 - Working with Dates, Calendars, and DatePickers感兴趣,尽管这篇文章已经很老了(2007 年)。

于 2012-05-19T09:34:53.313 回答
12

只需使用类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();
于 2012-05-18T15:17:39.963 回答
8

我解决了那个问题。这是因为某些月份的异常,所以如果你想减去两个日期时间,你应该将两者都转换为公历,然后你可以减去它们并查看结果。

这是代码:

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 
于 2012-08-10T20:10:25.293 回答
5

这里是文档是你的朋友的地方:

波斯日历类

DateTime 构造函数(Int32、Int32、Int32、日历)

这是您需要的确切代码:

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什么?如果您想要两个日期之间的天数,那么只需执行此操作(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:

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。

于 2012-05-18T15:29:19.477 回答
2

您还可以使用以下 .net 库像使用 DateTime 一样简单地使用 PersianCalendar:

C# 中的波斯日历(PersianDateTime)

var persianDateTime = PersianDateTime.Now;
persianDateTime.EnglishNumber = true;
Console.Write(persianDateTime.ToString());
于 2014-12-27T09:58:13.753 回答
1

您可以使用以下代码:

  DateTime today = DateTime.Today; // excludes h/m/s

  DateTime userdate = DateTime.Parse(textBox9.Text);

如果你从另一个中减去一个,你会得到一个 TimeSpan。

  TimeSpan diff = today - userDate;

您可以使用此时间跨度的属性以您喜欢的方式显示它们。

要管理转换表/到波斯历,您有一个很好的解决方案:

.NET 如何将波斯语(Jalali 日历)的日期字符串解析为 DateTime 对象?

参考:

日期时间.今天

时间跨度

于 2012-05-18T15:30:00.300 回答
1

这是我正在使用的代码:

  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;
        }
于 2014-07-02T18:30:30.393 回答
1

使用Noda Time可以更轻松地完成此操作:

using System.Globalization;
using NodaTime;
using NodaTime.Text;

...

CultureInfo culture = CultureInfo.CreateSpecificCulture("fa-IR");
CalendarSystem calendar = CalendarSystem.GetPersianCalendar();
LocalDate template = new LocalDate(1, 1, 1, calendar);
LocalDatePattern pattern = LocalDatePattern.Create("yyyy/M/d", culture, template);
LocalDate result = pattern.Parse("1391/2/30").Value;

// if you need a DateTime, then:
DateTime dt = result.AtMidnight().ToDateTimeUnspecified();
于 2015-09-20T19:47:50.693 回答
0

试试这个代码:这个代码是由“grzegorz W”发布的编辑代码,但是他的代码会产生错误,例如当用户输入日期=“1394/06/31”并且错误是“年、月和日参数描述一个un-可表示的日期时间"

下面的代码是好的:

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);
于 2016-09-21T09:23:49.393 回答
0

您可以使用这个简单的代码将波斯日历值转换为 C# 中的 Datetime 对象并进行计算。

DateTime dateTime 
      = new DateTime(persianYear, persianMonth, persianDay, new PersianCalendar());
于 2020-05-19T07:49:39.560 回答
0

你好你可以使用这个扩展方法:

public static class PersainDateTime
{

    public static DateTime PersianDateToMiladi(this string value)
        {
            string[] d = value.Split('/');
            return new DateTime(int.Parse(d[0]), int.Parse(d[1]), int.Parse(d[2]), new System.Globalization.PersianCalendar());
        }
}

现在,您可以在任何地方使用它:

var date=("1395/10/5").PersianDateToMiladi();

或者

var date= textbox1.text.PersianDateToMiladi();
于 2020-11-12T07:35:09.333 回答
0
private void timer1_Tick(object sender, EventArgs e)
{
    labelDataAD.Text = DateTime.Now.ToString("dd/MM/yyyy");
    PersianCalendar persianCalendar = new PersianCalendar();
    string Full = persianCalendar.GetYear(DateTime.Now) + "/" + 
    persianCalendar.GetMonth(DateTime.Now)+"/"+ 
    persianCalendar.GetDayOfMonth(DateTime.Now);
    labelDataSolar.Text = string.Format("{0:yyyy\\:MM\\:dd}", Full);
}

private void FormCalendar_Load(object sender, EventArgs e)
{           
    timer1.Start();
}

输出是:

日期输出

于 2021-08-06T07:36:43.627 回答
0

对于我的情况,这个解决方案对我有帮助:我在我的项目中创建工具文件夹然后我把类 ExtensionsHelper.cs 和 HijriDateTime.cs 和 PersianDateTime.cs 和 PersianDayOfWeek.cs 放在这个链接中你可以找到上面的类:< https:// github.com/Mds92/MD.PersianDateTime > 然后我使用 PersianDateTime 而不是 DateTime:

DateTime datetime = new DateTime(PersianDateTime.Now.Year, PersianDateTime.Now.Month, PersianDateTime.Now.Day, 0, 0, 0);
于 2022-01-14T07:12:41.920 回答