编辑2009年11月4日
好的,自从我第一次发布这个问题以来已经有一段时间了.在我看来,许多最初的响应者都没能真正得到我所说的 - 一个共同的反应是"你所说的没有任何意义"的一些变化 - 所以我做了一些方便图表真的说明了我的观点.
当我们谈到数字时,我们通常指的是学校儿童学习的等级被称为数字线:

现在,当我们学习算术时,我们的思想学会对这个概念进行非常有趣的转换.1 + 0.5例如,如果我们只是应用我们的"数字线思维",那么评估表达式将要求我们以某种方式理解这一点:

很难真正说明这一点,因为很难想到这一点:"增加"两点.这是许多响应者在添加日期(或者简单地认为它是荒谬的)的想法中挣扎的地方,因为他们认为日期是积分.
然而,这个表达1 + 0.5 确实对我们有意义,因为当我们想到它时,我们真的想象这个:

也就是说,数字(或点)1加上矢量 0.5,得到点 1.5.
或者,我们可能想象这个:

也就是说,向量 1加上向量 0.5,得到向量 1.5.
换句话说,在处理数字时,我们可以互换地处理点和向量.但是约会怎么样?毕竟,日期基本上是数字.如果您不相信我,请将此行与上面的数字行进行比较:

注意时间线和数字线之间的对应关系?这就是我的观点:如果我们用数字执行上面的转换,我们也应该能够用日期来完成.所以,应用"时间轴思维",这个表达0001-Jan-02 00:00:00 + 0001-Jan-01 12:00:00并没有多大意义,因为很多响应者指出:

但是,如果我们在每次添加或减去数字时执行相同的概念转换,我们可以轻松地"重新考虑"上述内容:

很明显,a DateTime和a 之间的TimeSpan差异与点和矢量之间存在的差异相同.我认为让很多人对我的建议做出负面反应的是,以这种方式将日期视为大小只是感觉如此不自然.但我不认为没有明显的参考点可以用作零.有一个明显的参考点,我会给你一个暗示:大约在2010年前.
不要误解我的意思:我不是在质疑a 和a 的概念之间划分概念的有用性.说真的,我的问题一直以来应该是(为ChrisW间接暗示),为什么做我们对待数字和载体互换与普通数字类型打交道?(或者:为什么我们只有一种类型,而不是和?)有一个很大的区别,但是在初中或高中,当我们开始几何时,我们从来没有真正考虑过它.然后它被视为这个新的数学概念,而实际上它是我们一直在利用的东西,因为我们通过用手指计数来学习添加数字.DateTimeTimeSpanintintintspan
最后,最好的答案来自Strilanc,他指出使用DateTime和TimeSpan实际上是仿射空间的实现,它具有不需要参考点作为原点的方便性.谢谢,Strilanc.然而,我给出了ChrisW的接受答案,因为他是第一个提出矢量和点的概念的人,这真正解决了问题的关键.
原始问题(后代)
我当然不是所有行业的编程插孔,但我知道PHP和.NET …
看来,ConfigurationElement中TimeSpan无法处理超过23:59:59较大的值.有没有解决方法?是继承TimeSpan,并使一个新的TimeSpanValidatorAttribute甚至上班?我需要处理从几分钟到几天的时间跨度.
我正在使用以下配置部分
[ConfigurationProperty("SequenceRolloverDOSCompare", IsRequired = true)]
[TimeSpanValidator(MinValueString = "0:0:00", MaxValueString = 10675199.02:48:05.4775807", ExcludeRange = false)]
public TimeSpan SequenceRolloverDOSCompare
{
get
{
return (TimeSpan)base["SequenceRolloverDOSCompare"];
}
}
Run Code Online (Sandbox Code Playgroud)
配置看起来像这样:
<SequenceRolloverPolling SequenceRolloverDOSCompare="2:00:00:00" />
Run Code Online (Sandbox Code Playgroud)
给 ConfigurationErrorsException : The value of the property 'SequenceRolloverDOSCompare' cannot be parsed. The error is: 2:00:00:00 is not a valid value for TimeSpan.
或这个:
<SequenceRolloverPolling SequenceRolloverDOSCompare="48:00:00" />
Run Code Online (Sandbox Code Playgroud)
给 OverflowException : The TimeSpan could not be parsed because at least one of the hours, …
我想在字符串中显示两个日期之间的经过时间.
假设我有以下代码:
DateTime date1 = DateTime.Now();
System.Threading.Thread.Sleep(2500);
DateTime date2 = DateTime.Now();
TimeSpan elapsed = date2.substract(date1);
Console.WriteLine("> {0:hh:mm:ss}", elapsed);
Run Code Online (Sandbox Code Playgroud)
我期待的是:
> 00:00:03
Run Code Online (Sandbox Code Playgroud)
我得到了什么:
> 00:00:02.5002500
Run Code Online (Sandbox Code Playgroud)
有没有办法使用String.Format函数只返回完整秒?
我还尝试删除小数位:
elapsed = elapsed.Substract(TimeSpan.FromMiliseconds((double)Timespan.Miliseconds);
Run Code Online (Sandbox Code Playgroud)
但是,自从elapsed以来,这都不起作用.Miliseconds返回500作为整数.
我有以下代码:
DateTime pickerDate = Convert.ToDateTime(pickerWakeupDate.SelectedDate);
string enteredStr = pickerDate.ToShortDateString() + " " + textWakeupTime.Text;
string format = "dd/M/yyyy HH:mm";
DateTime enteredDate = DateTime.ParseExact(enteredStr, format, null);
Run Code Online (Sandbox Code Playgroud)
我面临的问题是,我想现在就确定设定日期和日期和时间之间的差异.然后,该值需要为我提供日期之间的分钟数.
我试过用:
DateTime todaysDateTime = DateTime.Now;
TimeSpan span = enteredDate.Subtract(todaysDateTime);
int totalMins = span.Minutes;
Run Code Online (Sandbox Code Playgroud)
但是0当这个值提前10分钟时,这给了我一个不正确的值.
谁能帮我解决这个问题
谢谢.
我有一个TimeSpan代表客户端连接到我的服务器的时间.我想将其显示TimeSpan给用户.但我不想过于冗长地显示那些信息(例如:2小时3分钟32.2345秒=太详细了!)
例如:如果连接时间是......
> 0 seconds and < 1 minute -----> 0 Seconds
> 1 minute and < 1 hour -----> 0 Minutes, 0 Seconds
> 1 hour and < 1 day -----> 0 Hours, 0 Minutes
> 1 day -----> 0 Days, 0 Hours
Run Code Online (Sandbox Code Playgroud)
当然,在数字为1(例如:1秒,1分钟,1小时,1天)的情况下,我想使文本单数(例如:1秒,1分钟,1小时,1天) .
无论如何,如果没有一组巨大的if/else子句,可以轻松实现吗?这是我目前正在做的事情.
public string GetReadableTimeSpan(TimeSpan value)
{
string duration;
if (value.TotalMinutes < 1)
duration = value.Seconds + " Seconds";
else if (value.TotalHours < 1)
duration = value.Minutes + " Minutes, " …Run Code Online (Sandbox Code Playgroud) 我有一个包含几个时间选择器的MVC页面.它们存储在模型中的对象列表中,可以为空TimeSpan.问题是我将带有秒的打印时间输入到输入字段中.有没有办法格式化这些模型属性,以便我以其他方式打印时间跨度(比如7:00,而不是07:00:00)?毋庸置疑,我的"建议" [DisplayFormat...]没有奏效.至少不是我希望的方式.
输入字段的定义如下:
@Html.TextBoxFor(x => x.Shifts[i].Start)
Run Code Online (Sandbox Code Playgroud)
该模型的相关部分如下:
public class Workshift
{
[DisplayFormat(Something here perhaps?)]
public TimeSpan? Start { get; set; }
public TimeSpan? End { get; set; }
public TimeSpan? Pause { get; set; }
}
public class TimeRegistrationViewModel
{
public List<Workshift> Shifts { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
一如既往地欣赏它!
我正在使用 .Net Core 3.0 并有以下字符串,我需要用 Newtonsoft.Json 反序列化:
{
"userId": null,
"accessToken": null,
"refreshToken": null,
"sessionId": null,
"cookieExpireTimeSpan": {
"ticks": 0,
"days": 0,
"hours": 0,
"milliseconds": 0,
"minutes": 0,
"seconds": 0,
"totalDays": 0,
"totalHours": 0,
"totalMilliseconds": 0,
"totalMinutes": 0,
"totalSeconds": 0
},
"claims": null,
"success": false,
"errors": [
{
"code": "Forbidden",
"description": "Invalid username unknown!"
}
]
}
Run Code Online (Sandbox Code Playgroud)
并遇到以下错误:
Newtonsoft.Json.JsonSerializationException : Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.TimeSpan' because the type requires a JSON primitive value (e.g. …Run Code Online (Sandbox Code Playgroud) timespan json.net json-deserialization .net-core .net-core-3.0
是否有标准库方法将具有标准ISO 8601持续时间(也在XSD中用于其duration类型)格式的持续时间的字符串转换为.NET TimeSpan对象?
例如,表示持续时间为1小时的P0DT1H0M0S将转换为New TimeSpan(0,1,0,0,0).
反向转换器确实存在,其工作方式如下:Xml.XmlConvert.ToString(New TimeSpan(0,1,0,0,0))上面的表达式将返回P0DT1H0M0S.
我正在使用.NET 3.5编译C#并尝试将TimeSpan转换为字符串并格式化字符串.我想用
myString = myTimeSpan.ToString("c");
但是在TimeSpan.ToString.NET 4.0和我使用.NET 3.5之前,该方法不会将格式字符串作为参数.
那么你如何将TimeSpan格式化为字符串?我的最终目标是以格式显示TimeSpan,hh:mm:ss但目前正在接收hh:mm:ss:fffffff.
我试过用
myString = string.Format("{0:hh:mm:ss}", myTimeSpan);
但是string.Format只是格式化我的DateTime,并且在尝试格式化TimeSpan时传递不同的格式字符串不起作用.