文本框字符串未被识别为有效的日期时间
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 处输出代码。我在那里包含了输出,因此您可以在此过程中看到中间结果。
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 处输出代码。我在那里包含了输出,因此您可以在此过程中看到中间结果。