文本框字符串未被识别为有效的日期时间

Text box string not recognized as valid DateTime

const double PERCENT = 0.25;


DateTime t1 = Convert.ToDateTime(txtB_StartT.Text);
DateTime t2 = Convert.ToDateTime(txtB_EndT.Text);
TimeSpan ts = t1.Subtract(t2);

我似乎无法将其解析为 DateTime

double tsMin = Convert.ToDouble(ts);
double tsMinTot = ts.TotalMinutes;
short tsMinPercent = (short)(((double)tsMinTot) * PERCENT);
double tsAndPercentTot = tsMinPercent + tsMinTot;

我的目标是找到一个时间差,找到那个时间差的 25% 并将其添加到时间差中。

DateTime newTimeMinTot = Convert.ToDateTime(tsAndPercentTot);
int hours = newTimeMinTot.Hour;
int minutes = newTimeMinTot.Minute;

尝试获取计算出的新日期时间

string newTimeStrg = string.Format("{0:d1}:{1:d2}", hours, minutes);
txtB_NewDelivT.Text = newTimeStrg;

尝试将新的 DateTime 输出到 TextBox。

有人请解释。我怎样才能让用户在军事时间输入并使它工作。

强制你的 date/datetime 格式

DateTime mydate =   DateTime.ParseExact(TextBox1.Text.Trim(), "dd/MM/yyyy", null);

这样做:

const double PERCENT = 0.25;

DateTime t1 = Convert.ToDateTime(txtB_StartT.Text);
DateTime t2 = Convert.ToDateTime(txtB_EndT.Text);
TimeSpan ts = t1.Subtract(t2);

long tsMinPercent = ts.Ticks + (long)(ts.Ticks * PERCENT);

var tsAndPercentTot = TimeSpan.FromTicks(tsMinPercent);

string newTimeStrg = string.Format("{0:d1}:{1:d2}", tsAndPercentTot.Hours, tsAndPercentTot.Minutes);
txtB_NewDelivT.Text = newTimeStrg;

这里我使用 DateTime.Ticks to calculate percentage of time of difference and TimeSpan.FromTicks 从计算的日期时间百分比中再次找到 DateTime

您可以使用 TimePicker.

而不是 TextBox

根据您写的输入值为“0945”和“1445”的评论,我建议您将 TextBox 控件替换为 DateTimePicker 控件。

只是为了让它们像您现在所做的那样显示值,您必须设置一些属性,就像我在这里向您展示的那样。

picker.Format = DateTimePickerFormat.Custom;
picker.CustomFormat = "HHmm";
picker.ShowUpDown = true;

稍后,picker.Value 将 return 一个带时间的完整日期,其中分和秒将类似于输入值。

您可以从设计器中明显地设置属性的值。

此致,
丹尼尔.

好吧,我采用了不同的方法,结果相当简单。 我不确定我是否可以回答我自己的问题,但我想 会帮助遇到同样问题的人。

    // Set Constant values.
    const double PERCENT = .25;
    const int HUN_PART = 100, SIXTY = 60, one = 1;

                // Parse start time textbox value as int 
                // Calculate start time hours and minutes                    
                int sT = int.Parse(textBox1.Text);
                int sH = sT / HUN_PART;
                int sM = sT % HUN_PART;

                        // Calculate total start time in minutes
                        int sH_M = sH * SIXTY;
                        int sTotM = sH_M + sM;

                // Parse end time textbox value as int
                // Calculate end time hours and minutes
                int eT = int.Parse(textBox2.Text);
                int eH = eT / HUN_PART;
                int eM = eT % HUN_PART;

                        // Calculate total end time in minutes
                        int eH_M = eH * SIXTY;
                        int eTotM = eH_M + eM;

                // Calculate time difference in minutea
                // Calculate percent of time difference
                double dT_M = Convert.ToInt32(eTotM - sTotM);
                int perc = Convert.ToInt32(dT_M * PERCENT);

                        // Calculate new arrival time in total min then in hours
                        double newD_M = perc + eTotM;
                        double newD_H = newD_M / SIXTY;

                // Calculate new arrivaltime in remaining minutes
                double nD_H_Convert = Math.Truncate(newD_H);
                int nD_H = Convert.ToInt32(nD_H_Convert);
                int nD_Hours = nD_H * HUN_PART;
                double nD_Min = nD_H * SIXTY;
                int nD_M = Convert.ToInt32(newD_M - nD_Min);
                int newDeliveryTime = (nD_H * HUN_PART) + nD_M;

                // Put values for new arive time hours and minutes in appropriate string format
                string newTime = string.Format("{0:d4}", newDeliveryTime);

                // Output arrival time string in textbox
                textBox3.Text = newTime;

我显然想做的比实际需要的多,所以通过一些简单的计算,问题就解决了。

谢谢大家的帮助。

因为我没有您的表格,所以我将省略 UI 互动。以下是解析输入流的方法。我已经展示了如何解析 hh:mm 格式以及 hhmm 格式:

var start = TimeSpan.ParseExact("10:00", "hh\:mm", CultureInfo.InvariantCulture);
var finish = TimeSpan.ParseExact("1100", "hhmm", CultureInfo.InvariantCulture);

一旦你有了开始和结束,我们所要做的就是数学。我们将从滴答声(TimeSpan 上的最小测量单位)乘以我们的百分比 (0.25) 创建一个新的 TimeSpan。然后我们只需将调整添加到我们的开始时间,我们就完成了!然后你可以将它分配到你需要输出的地方。

var diff = finish - start;
var adjustment = TimeSpan.FromTicks((long)(diff.Ticks * 0.25));
var adjustedStart = start + adjustment;

您可以 运行 在 dotNetFiddle 处输出代码。我在那里包含了输出,因此您可以在此过程中看到中间结果。