在开发中,一涉及到时间,DateTime类就是是一定会想到的。datetime常用,但是对于本人更多的应用往往没有去学习和关注。今天就总结一下datetime的相关使用。(应该会不定期补充)
一、DateTime类
格式字符 关联属性/说明
d ShortDatePattern
D LongDatePattern
f 完整日期和时间(长日期和短时间)
F FullDateTimePattern(长日期和长时间)
g 常规(短日期和短时间)
G 常规(短日期和长时间)
m MMonthDayPattern
r RRFC1123Pattern
s 使用当地时间的SortableDateTimePattern(基于ISO8601)
t ShortTimePattern
T LongTimePattern
u UniversalSortableDateTimePattern用于显示通用时间的格式
U 使用通用时间的完整日期和时间(长日期和长时间)
y YYearMonthPattern
自定义的格式可以通过使用(y,M,d,h,m,s,f,t)自由组合
yy 年份后两位
yyyy四位年份
MM月份两位(前边用零补)
MMM月份缩写
MMMM月份全写
dd日期(用零补)
ddd 星期缩写
dddd星期全写
HH 24小时hh
12小时 mm 分钟
ss 秒数
ff 两位数毫秒
fff 三位数毫秒
ffff 四位数毫秒
获取时间
static void Main(string[] args)
{
//HH:24小时 hh:12小时
Console.WriteLine("yyyy-MM-dd HH:mm:ss:fff " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff"));
Console.WriteLine("yyyy-MM-dd HH:mm:ss:ms " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ms"));
Console.WriteLine("y " + DateTime.Now.ToString("y"));
Console.WriteLine("dddd "+DateTime.Now.ToString("dddd"));
Console.WriteLine("dddd, MMMM dd yyyy " + DateTime.Now.ToString("dddd, MMMM dd yyyy"));
Console.WriteLine("ddd, MMM d yy " + DateTime.Now.ToString("ddd, MMM d yy"));
Console.WriteLine("dddd, MMMM dd " + DateTime.Now.ToString("dddd, MMMM dd"));
Console.WriteLine("M/yy " + DateTime.Now.ToString("M/yy"));
Console.WriteLine("dd-MM-yy " + DateTime.Now.ToString("dd-MM-yy"));
Console.WriteLine();
Console.WriteLine("ToString('t'): "+DateTime.Now.ToString("t"));
Console.WriteLine("ToString('d'): "+DateTime.Now.ToString("d"));
Console.WriteLine("ToString('D'): "+DateTime.Now.ToString("D"));
Console.WriteLine("ToString('f'): "+DateTime.Now.ToString("f"));
Console.WriteLine("ToString('F'): "+DateTime.Now.ToString("F"));
Console.WriteLine("ToString('G'): "+DateTime.Now.ToString("G"));
Console.WriteLine("ToString('t'): "+DateTime.Now.ToString("t"));
Console.WriteLine("ToString('T'): "+DateTime.Now.ToString("T"));
Console.WriteLine("ToString('U'): "+DateTime.Now.ToString("U"));
Console.WriteLine("ToString('u'): "+DateTime.Now.ToString("u"));
Console.WriteLine("ToString('m'): "+DateTime.Now.ToString("m"));
Console.WriteLine("ToString('M'): "+DateTime.Now.ToString("M"));
Console.WriteLine("ToString('r'): "+DateTime.Now.ToString("r"));
Console.WriteLine("ToString('R'): "+DateTime.Now.ToString("R"));
Console.WriteLine("ToString('y'): "+DateTime.Now.ToString("y"));
Console.WriteLine("ToString('Y'): "+DateTime.Now.ToString("Y"));
Console.WriteLine("ToString('o'): "+DateTime.Now.ToString("o"));
Console.WriteLine("ToString('O'): "+DateTime.Now.ToString("O"));
Console.WriteLine("ToString('s'): "+DateTime.Now.ToString("s"));
Console.ReadKey();
}
二、获取时间差 TimeSpan类
TimeSpan和DateTime都是Unity.System下的字段,DateTime表示的是时间点,TimeSpan表示的是时间段。
TimeSpan值包含了许多属性与方法,用于访问或处理一个TimeSpan值,其中的五个重载方法之一的结构 TimeSpan( int days, int hours, int minutes, int seconds )
下面的列表涵盖了其中的一部分方法及属性解释
Add:与另一个TimeSpan值相加。
Days:返回用天数计算的TimeSpan值。
Duration:获取TimeSpan的绝对值。
Hours:返回用小时计算的TimeSpan值
Milliseconds:返回用毫秒计算的TimeSpan值。
Minutes:返回用分钟计算的TimeSpan值。
Negate:返回当前实例的相反数。
Seconds:返回用秒计算的TimeSpan值。
Subtract:从中减去另一个TimeSpan值。
Ticks:返回TimeSpan值的tick数。
TotalDays:返回TimeSpan值表示的天数。
TotalHours:返回TimeSpan值表示的小时数。
TotalMilliseconds:返回TimeSpan值表示的毫秒数。
TotalMinutes:返回TimeSpan值表示的分钟数。
TotalSeconds:返回TimeSpan值表示的秒数。
例子:
//利用TimeSpan计算时间差
DateTime dt1 = order.CreateTime;//订单创建时间
TimeSpan ts = DateTime.Now.Subtract(dt1);
if (ts.TotalHours > 2) //判断是否大于2小时
{}
负数
上面是较晚的日期减较早的日期,所以各属性值为正数,如果是较早的日期减较晚的日期,则属性值为负数。
ASP.NET 中,两个时间相减,得到一个 TimeSpan 实例,TimeSpan 有一些属性:Days、TotalDays、Hours、TotalHours、Minutes、TotalMinutes、Seconds、TotalSeconds、Ticks,注意没有 TotalTicks。
举例说明
时间 1 是 2010-1-2 8:43:35;时间 2 是 2010-1-12 8:43:34。
用时间 2 减时间 1,得到一个 TimeSpan 实例。
那么时间 2 比时间 1 多 9 天 23 小时 59 分 59 秒。
那么,Days 就是 9,Hours 就是 23,Minutes 就是 59,Seconds 就是 59。
再来看 Ticks,Tick 是一个计时周期,表示一百纳秒,即一千万分之一秒,那么 Ticks 在这里表示总共相差多少个时间周期,即:9 * 24 * 3600 * 10000000 + 23 * 3600 * 10000000 +59 * 60 * 10000000 + 59 * 10000000 = 8639990000000。3600 是一小时的秒数。
TotalDays 就是把 Ticks 换算成日数,即:8639990000000 / (10000000 * 24 * 3600) = 9.99998842592593。
TotalHours 就是把 Ticks 换算成小时数,即:8639990000000 / (10000000 * 3600) = 239.999722222222。
TotalMinutes 就是把 Ticks 换算成分钟数,即:8639990000000 / (10000000 * 60) = 14399.9833333333。
TotalSeconds 就是把 Ticks 换算成秒数,即:8639990000000 / (10000000) = 863999。
以下提供一些常用的方法
//求离最近发表时间的函数
public string DateStringFromNow(DateTime dt)
{
TimeSpan span = DateTime.Now - dt;
if (span.TotalDays > 60){
return dt.ToShortDateString();
}
else if ( span.TotalDays > 30 ){
return "1个月前";
}
else if (span.TotalDays > 14){
return "2周前";
}
else if (span.TotalDays > 7){
return "1周前";
}
else if (span.TotalDays > 1){
return string.Format("{0}天前", (int)Math.Floor(span.TotalDays));
}
else if (span.TotalHours > 1){
return string.Format("{0}小时前", (int)Math.Floor(span.TotalHours));
}
else if (span.TotalMinutes > 1){
return string.Format("{0}分钟前", (int)Math.Floor(span.TotalMinutes));
}
else if (span.TotalSeconds >= 1){
return string.Format("{0}秒前", (int)Math.Floor(span.TotalSeconds));
}
else {
return "1秒前";
}
}
C#中使用TimeSpan计算两个时间的差值
//可以反加两个日期之间任何一个时间单位。
private string DateDiff(DateTime DateTime1, DateTime DateTime2)
{
string dateDiff = null;
TimeSpan ts1 = new TimeSpan(DateTime1.Ticks);
TimeSpan ts2 = new TimeSpan(DateTime2.Ticks);
TimeSpan ts = ts1.Subtract(ts2).Duration();
dateDiff = ts.Days.ToString()+"天"+ ts.Hours.ToString()+"小时"+ ts.Minutes.ToString()+"分钟"+ ts.Seconds.ToString()+"秒";
return dateDiff;
}
.TotalDays和.Days的区别(其他类同):
TimeSpan ts = Date1 - Date2;
double dDays = ts.TotalDays;//带小数的天数,比如1天12小时结果就是1.5
比如1天12小时结果就是1.5
int nDays = ts.Days;//整数天数,1天12小时或者1天20小时结果都是1
/// <summary>
/// 日期比较
/// </summary>
/// <param name="today">当前日期</param>
/// <param name="writeDate">输入日期</param>
/// <param name="n">比较天数</param>
/// <returns>大于天数返回true,小于返回false</returns>
private bool CompareDate(string today, string writeDate, int n)
{
DateTime Today = Convert.ToDateTime(today);
DateTime WriteDate = Convert.ToDateTime(writeDate);
WriteDate = WriteDate.AddDays(n);
if (Today>= WriteDate)
return false;
else
return true;
}
三、时间戳
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
通俗的理解就是证明时间的可查证印章。比如我要拍照,如何证明时间呢,拍时钟显然不可能证明,我们可以通过拍摄新闻报纸和彩票开奖号码的方式证明。
第一种:
/// <summary>
/// 获取当前时间戳
/// </summary>
/// <returns></returns>
public string GetTimeStamp()
{
TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
第二种:
/// <summary>
/// 获取时间戳
/// </summary>
/// <returns></returns>
public static string GetTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
lua的获取时间戳:print(os.time())
Unix时间戳(Unix timestamp),或称Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数。Unix时间戳不仅被使用在Unix系统、类Unix系统中(比如Linux系统),也在许多其他操作系统中被广泛采用。
php中获取时间戳的方法是:time();Date();
Linux中获取时间戳的方法是:date +%s
Linux中将时间戳转换为日期: date -d "@<timestamp>"
>> C# DateTime转换为Unix时间戳
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区
long timeStamp = (long)(DateTime.Now - startTime).TotalSeconds; // 相差秒数
System.Console.WriteLine(timeStamp);
>> Unix时间戳转换为C# DateTime
long unixTimeStamp = 1478162177;
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区
DateTime dt = startTime.AddSeconds(unixTimeStamp);
System.Console.WriteLine(dt.ToString("yyyy/MM/dd HH:mm:ss:ffff"));