2017-11-15 17:48:43 CSDN_soul 阅读数 583

UTC时间 

 世界标准时间,格林威治时间

Unix时间戳 

当前时间距本时区1970年毫秒数

所以同一时刻全球的时间戳都相等

2015-12-23 17:51:10 gdp12315 阅读数 1429

什么是Unix时间戳(Unix timestamp):

Unix时间戳(Unix timestamp),或称Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,

定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。Unix时间戳不仅被使用在Unix系统、类Unix系统中,也在许多其他操作系统中被广泛采用

 

当地标准时间 (Local Standard Time ,LST)

 

世界协调时间(Universal Time Coordinated,UTC)
GPS 系统中有两种时间区分,一为UTC,另一为LST(地方时)两者的区别为时区不同,
UTC就是0时区的时间,地方时为本地时间,如北京为早上八点(东八区),UTC时间就为零点,时间比北京时晚八小时,以此计算即可。

 

格林尼治标准时间(旧译格林尼治平均时间或格林威治标准时间;英语:Greenwich Mean Time,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。自1924年2月5日开始,格林尼治天文台每隔一小时会向全世界发放调时信息。

 


获取Unix时间,以及转换工具

 

 

http://tool.chinaz.com/Tools/unixtime.aspx

2019-02-18 18:48:59 qq_29350001 阅读数 5889

如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/87637350

我碰到的问题,GPS上UTC时间转北京时间和STM32上UNIX时间戳转北京时间。
这部分之前讲RTC和GPS的时候有涉及到一部分。
具体的RTC如何得到UNIX时间戳,和GNRMC如何解析得到UTC时间可以参看一下。
参看:STM32开发 – RTC详解
参看:STM32开发 – GPS模块开发详解

扩展:C语言再学习 – 时间函数

这里主要看三者转换方法:

一、UTC时间转换为北京时间

参看:UTC时间转换为北京时间

时间类型结构体

//UTC时间信息
__packed typedef struct  
{										    
 	uint16_t year;	//年份
	uint8_t month;	//月份
	uint8_t date;	//日期
	uint8_t hour; 	//小时
	uint8_t min; 	//分钟
	uint8_t sec; 	//秒钟
}nmea_time;

UTC时间转任意时区时间

其中,北京时间 = UTC time + 8 hours

void UTC_to_BJtime(nmea_time*	utc_time, int8_t	timezone)
{
	int year,month,day,hour;
    int lastday = 0;					//last day of this month
    int lastlastday = 0;			//last day of last month

    year	 = utc_time->year;			 //utc time
    month  = utc_time->month;
    day 	 = utc_time->date;
    hour 	 = utc_time->hour + timezone; 
	
    if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12){
        lastday = 31;
        if(month == 3){
            if((year%400 == 0)||(year%4 == 0 && year%100 != 0))				//if this is lunar year
                lastlastday = 29;
            else
                lastlastday = 28;
        }
        if(month == 8)
            lastlastday = 31;
    }
    else if(month == 4 || month == 6 || month == 9 || month == 11){
        lastday = 30;
        lastlastday = 31;
    }
    else{
        lastlastday = 31;
        if((year%400 == 0)||(year%4 == 0 && year%100 != 0))
            lastday = 29;
        else
            lastday = 28;
    }

    if(hour >= 24){					// if >24, day+1
            hour -= 24;
            day += 1; 

            if(day > lastday){ 		// next month,  day-lastday of this month
                day -= lastday;
                month += 1;

                if(month > 12){		//	next year , month-12
                    month -= 12;
                    year += 1;
                }
            }
        }
    if(hour < 0){										// if <0, day-1
            hour += 24;
            day -= 1; 
            if(day < 1){					  // month-1, day=last day of last month
                day = lastlastday;
                month -= 1;
                if(month < 1){ 			// last year , month=12
                    month = 12;
                    year -= 1;
                }
            }
        }
   // transfer value to NMEA_result.local_time
	NMEA_result.local_time.year  = year;
	NMEA_result.local_time.month = month;
	NMEA_result.local_time.date  = day;
	NMEA_result.local_time.hour  = hour;
	NMEA_result.local_time.min	 = utc_time->min;
	NMEA_result.local_time.sec	 = utc_time->sec;
}

二、UNIX Time 时间戳 与 北京时间 相互转换

参看:UNIX Time 时间戳 与 北京时间 相互转换

typedef struct t_xtime {
  int year; int month;  int day;  
  int hour; int minute;  int second;
} _xtime ;
 
#define xMINUTE   (60             ) //1分的秒数
#define xHOUR      (60*xMINUTE) //1小时的秒数
#define xDAY        (24*xHOUR   ) //1天的秒数
#define xYEAR       (365*xDAY   ) //1年的秒数

1、将localtime(UTC+8北京时间)转为UNIX TIME,以1970年1月1日为起点

unsigned int  xDate2Seconds(_xtime *time)
{
  static unsigned int  month[12]={
    /*01月*/xDAY*(0),
    /*02月*/xDAY*(31),
    /*03月*/xDAY*(31+28),
    /*04月*/xDAY*(31+28+31),
    /*05月*/xDAY*(31+28+31+30),
    /*06月*/xDAY*(31+28+31+30+31),
    /*07月*/xDAY*(31+28+31+30+31+30),
    /*08月*/xDAY*(31+28+31+30+31+30+31),
    /*09月*/xDAY*(31+28+31+30+31+30+31+31),
    /*10月*/xDAY*(31+28+31+30+31+30+31+31+30),
    /*11月*/xDAY*(31+28+31+30+31+30+31+31+30+31),
    /*12月*/xDAY*(31+28+31+30+31+30+31+31+30+31+30)
  };
  unsigned int  seconds = 0;
  unsigned int  year = 0;
  year = time->year-1970;       //不考虑2100年千年虫问题
  seconds = xYEAR*year + xDAY*((year+1)/4);  //前几年过去的秒数
  seconds += month[time->month-1];      //加上今年本月过去的秒数
  if( (time->month > 2) && (((year+2)%4)==0) )//2008年为闰年
    seconds += xDAY;            //闰年加1天秒数
  seconds += xDAY*(time->day-1);         //加上本天过去的秒数
  seconds += xHOUR*time->hour;           //加上本小时过去的秒数
  seconds += xMINUTE*time->minute;       //加上本分钟过去的秒数
  seconds += time->second;               //加上当前秒数<br> seconds -= 8 * xHOUR;
  return seconds;
}

2、将UNIX时间转为UTC+8 即北京时间

//UNIX转为UTC 已进行时区转换 北京时间UTC+8
void xSeconds2Date(unsigned long seconds,_xtime *time )
{
    static unsigned int month[12]={
        /*01月*/31, 
        /*02月*/28, 
        /*03月*/31, 
        /*04月*/30, 
        /*05月*/31, 
        /*06月*/30, 
        /*07月*/31, 
        /*08月*/31, 
        /*09月*/30, 
        /*10月*/31, 
        /*11月*/30, 
        /*12月*/31 
    };
    unsigned int days; 
    unsigned short leap_y_count; 
    time->second      = seconds % 60;//获得秒 
    seconds          /= 60; 
    time->minute      =  seconds % 60;//获得分 
    seconds          += 8 * 60 ;        //时区矫正 转为UTC+8 bylzs
    seconds          /= 60; 
    time->hour        = seconds % 24;//获得时 
    days              = seconds / 24;//获得总天数 
    leap_y_count = (days + 365) / 1461;//过去了多少个闰年(4年一闰) 
    if( ((days + 366) % 1461) == 0) 
    {//闰年的最后1天 
        time->year = 1970 + (days / 366);//获得年 
        time->month = 12;              //调整月 
        time->day = 31; 
        return; 
    } 
    days -= leap_y_count; 
    time->year = 1970 + (days / 365);     //获得年 
    days %= 365;                       //今年的第几天 
    days = 01 + days;                  //1日开始 
    if( (time->year % 4) == 0 ) 
    { 
        if(days > 60)--days;            //闰年调整 
        else 
        { 
            if(days == 60) 
            { 
                time->month = 2; 
                time->day = 29; 
                return; 
            } 
        } 
    } 
    for(time->month = 0;month[time->month] < days;time->month++) 
    { 
        days -= month[time->month]; 
    } 
    ++time->month;               //调整月 
    time->day = days;           //获得日 
}

3、UTC(字符串)转UNIX时间

/*******************************************************************************
* Function Name  : ConvertTimeToSecond
* Description    : Convert GPS Date to Log buffer.
* Input          : @date: format 'DDMMYY,HHMMSS.SSS'
* Output         : None
* Return         : Sencod
*******************************************************************************/
static u32 ConvertDateToSecond(const u8 *date)
{
	u32 sencods = 0;
	u16 temp = 1970;
	u16 days = 0;
	if(NULL == date) {
		return 0;
	}
	//year
	temp = (date[4] - 0x30) * 10 + (date[5] - 0x30) + 2000;
	if(0 == (temp % 4)) {
		days += 1;
	}
	temp -= 1;
	//UTC time start 1970
	for(; temp >= 1970; temp--) {
		if(temp % 4) {
			days += 365;
		} else {
			//leap year
			days += 366;
		}
	}
	//month
	temp = (date[2] - 0x30) * 10 + (date[3] - 0x30);
	temp -= 1;
	for(; temp >= 1; temp--) {
		days += months[temp];
	}
	//day
	temp = (date[0] - 0x30) * 10 + (date[1] - 0x30);
	days += temp - 1;
	//hour
	temp = (date[7] - 0x30) * 10 + (date[8] - 0x30);
	sencods += temp * ONEMINUTETOSENCOND;
	//min
	temp = (date[9] - 0x30) * 10 + (date[10] - 0x30);
	sencods += temp * 60;
	//sencod
	temp = (date[11] - 0x30) * 10 + (date[12] - 0x30);
	sencods += temp;

	sencods += days * ONEDAYTOSENCOND;

	return sencods;
}

如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/87637350

2016-04-26 21:05:14 wang_zhenwei 阅读数 4021

ISO时间类型示例:

2013-12-10T16:54:26.777Z

UTC时间类型示例:

Tue Dec 10 16:54:26 CST 2013

UNIX时间类型示例:

1386694466777

转换方法:

package test2;

/** 各类时间类型转换 */
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Transfer {
	public static void main(String[] args) throws ParseException{		
		Long unix = 1386665666777L;
		String iso = "2013-12-10T16:54:26.777Z";
		
		System.out.println(unixToIso(unix));
		System.out.println(unixAdd8(unix));
		System.out.println(isoToUtc(iso));
		System.out.println(isoToUnix(iso));		
		
	}
	
	static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
	
	public static String unixToIso(long unix){					
		Date time = new Date(unix);  
		return format.format(time);		
	}
	
	public static long unixAdd8(long unix){					
		unix = unix +1000*60*60*8L;           
		return unix;
	}
	
	public static Date isoToUtc(String iso) throws ParseException{
		return format.parse(iso);		
	}
	

	public static  long isoToUnix(String iso) throws ParseException{					
		Date time = format.parse(iso);	
		long uinx = time.getTime();
		return uinx;
	}

}


参考:

ISO 8601日期扩展格式 与UTC 时间类型的相互转化

http://blog.csdn.net/mayixixi/article/details/8030473

unix时间戳(unix timestamp)与北京时间的互转方法

http://www.aiezu.com/system/linux/unix_timestamp_convert.html


2014-05-15 11:38:33 X_Craft 阅读数 1493

Unix时间是一种UNIX或类UNIX系统使用的时间表示方式,定义为从协调世界时UTC 1970年01月01日00时00分00秒起至现在的总秒数。相关知识请参考博文UNIX时间及相关概念

UNIX时间的转换在本章中这里更像是一个引子,引出了.Net中关于时间、时区和时差相关知识点。

在.Net时将某一时区时间转换成UNIX时间涉及到以下几个方面:

TimeSpan
用于表示一个时间间隔,即时间差
其中TotalSeconds属性以秒为单位表示当前TimeSpan结构值,Ticks属性以Tick为单位表示当前TimeSpan结构值
Tick中译为滴答也称为刻度,TimeSpan.TicksPerSecond常量字段用于表示一秒的刻度(滴答)数
一滴答 = 1000万分之一秒 = 万分之一毫秒 = 100纳秒

            DateTime dt1 = Convert.ToDateTime("2014/05/06 10:10:00");
            DateTime dt2 = Convert.ToDateTime("2014/05/06 10:15:00");
            TimeSpan ts = dt2 - dt1;
            Debug.WriteLine("TotalSeconds:{0} \t Ticks:{1} \t TicksPerSecond:{2}", ts.TotalSeconds, ts.Ticks, TimeSpan.TicksPerSecond);
            //output:
            //  TotalSeconds:300 	 Ticks:3000000000 	 TicksPerSecond:10000000

DateTime
表示时间上的一刻,通常以日期和当天的时间表示。

时间最重要的一个属性是时区,没有时区属性的时间不是一个完整的时间,有了时区就能得到时差,而后才能+-时差最终得到标准UTC时间

DateTime中与时区相关的属性和方法有Now、UtcNow、ToLocalTime()、ToUniversalTime()和Kind等

Now属性:获取一个 DateTime 对象,该对象设置为此计算机上的当前日期和时间,表示为本地时间。
UtcNow属性:获取一个 DateTime 对象,该对象设置为此计算机上的当前日期和时间,表示为协调通用时间 (UTC)。

ToLocalTime()方法:将当前 DateTime 对象的值转换为本地时间。
ToUniversalTime()方法:用于将当前 DateTime 对象的值转换为协调世界时 (UTC)。

那么,如何知道一个时间是本地时间还是UTC时间呢,这取决于DateTime的Kind属性

Kind属性:获取一个值,该值指示由此实例表示的时间是基于本地时间、协调世界时 (UTC),还是两者皆否。

Kind属性是一个枚举类型DateTimeKind,DateTimeKind枚举有三个成员
DateTimeKind.Local  表示的时间为本地时间
DateTimeKind.Unspecified 表示的时间既未指定为本地时间,也未指定为协调通用时间 (UTC)。
DateTimeKind.Utc  表示的时间为 UTC。

直接赋值、Now、UtcNow 三种不同的时间输入方式得到三种不同的Kind及时间

            DateTime dt1 = Convert.ToDateTime("2014/05/06 10:10:00");
            DateTime dt2 = DateTime.Now;
            DateTime dt3 = DateTime.UtcNow;
            Debug.WriteLine("dt1.kind:{0} \t dt2.kind:{1} \t dt3.kind:{2}", dt1.Kind, dt2.Kind, dt3.Kind);
            Debug.WriteLine("dt1:{0} \t dt2:{1} \t dt3:{2}", dt1, dt2, dt3);
            //output:
            //  dt1.kind:Unspecified 	 dt2.kind:Local 	 dt3.kind:Utc
            //  dt1:05/06/2014 10:10:00 	 dt2:05/15/2014 11:31:48 	 dt3:05/15/2014 03:31:48


而ToUniversalTime()和ToLocalTime()的转换也依赖于Kind,这里需要注意的是
当待转DateTime的Kind为Unspecified时,ToLocalTime()假定待转DateTime为UTC时间,转换等同于Kind为UTC,ToUniversalTime()假定待转DateTime为Local时间,转换等同于Kind为Local
当待转DateTime的Kind为Local时,ToUniversalTime()方法什么也不作,直接返回原待转时间
当待转DateTime的Kind为UTC时,ToUniversalTime()方法什么也不作,直接返回原待转时间

            DateTime dt1 = Convert.ToDateTime("2014/05/06 10:10:00");
            DateTime dt2 = dt1.ToLocalTime();
            DateTime dt3 = dt1.ToUniversalTime();
            Debug.WriteLine("dt1.kind:{0} \t dt2.kind:{1} \t dt3.kind:{2}", dt1.Kind, dt2.Kind, dt3.Kind);
            Debug.WriteLine("dt1:{0} \t dt2:{1} \t dt3:{2}", dt1, dt2, dt3);
            //output:
            //  dt1.kind:Unspecified 	 dt2.kind:Local 	 dt3.kind:Utc
            //  dt1:05/06/2014 10:10:00 	 dt2:05/06/2014 18:10:00 	 dt3:05/06/2014 02:10:00

            dt1 = DateTime.Now;
            dt2 = dt1.ToLocalTime();
            Debug.WriteLine("dt1.kind:{0} \t dt2.kind:{1}", dt1.Kind, dt2.Kind);
            Debug.WriteLine("dt1:{0} \t dt2:{1}", dt1, dt2);
            //output:
            //  dt1.kind:Local 	 dt2.kind:Local
            //  dt1:05/15/2014 11:33:46 	 dt2:05/15/2014 11:33:46

            dt1 = DateTime.UtcNow;
            dt2 = dt1.ToUniversalTime();
            Debug.WriteLine("dt1.kind:{0} \t dt2.kind:{1}", dt1.Kind, dt2.Kind);
            Debug.WriteLine("dt1:{0} \t dt2:{1}", dt1, dt2);
            //output:
            //  dt1.kind:Utc 	 dt2.kind:Utc
            //  dt1:05/15/2014 03:33:46 	 dt2:05/15/2014 03:33:46


DateTime也有一个Ticks属性,与TimeSpa不同的是,它表示的是自 0001 年 1 月 1 日午夜 12:00:00(DateTime.MinValue)以来经过的以Tick为单位的间隔数。

Local和UTC之间的转换涉及到时区即时差,在.Net中DateTimeOffset、TimeZoneInfo等类型用于时区时差

DateTimeOffset
DateTimeOffset 结构包括一个 DateTime 值以及一个 Offset 属性,该属性用于确定当前 DateTimeOffset 实例的日期和时间与协调世界时 (UTC) 之间的差值。 因为 DateTimeOffset 结构确切地定义了相对于 UTC 的日期和时间,所以它不包括 Kind 成员,这一点与 DateTime 结构相同。

DateTimeOffset构造函数更好的说明了它的作用

public DateTimeOffset(
	DateTime dateTime
)

使用指定的 DateTime 值初始化 DateTimeOffset 结构的新实例。
此构造函数的行为取决于 dateTime 参数的 DateTime.Kind 属性值:
如果 DateTime.Kind 的值为 DateTimeKind.Utc,则新实例的 DateTime 属性被设置为 dateTime,Offset 属性被设置为 Zero。
如果 DateTime.Kind 的值为 DateTimeKind.Local 或 DateTimeKind.Unspecified,则新实例的 DateTime 属性被设置为 dateTime,Offset 属性被设置为本地系统当前时区的偏移量。

            DateTimeOffset dtf1 = new DateTimeOffset(Convert.ToDateTime("2014/05/06 10:10:00"));
            DateTimeOffset dtf2 = DateTimeOffset.Now;
            DateTimeOffset dtf3 = DateTimeOffset.UtcNow;
            Debug.WriteLine("dtf1:{0}  dtf1.Offset:{1}  df1.DateTime.Kind:{2}", dtf1, dtf1.Offset, dtf1.DateTime.Kind);
            Debug.WriteLine("dtf2:{0}  dtf2.Offset:{1}  df2.DateTime.Kind:{2}", dtf2, dtf2.Offset, dtf2.DateTime.Kind);
            Debug.WriteLine("dtf3:{0}  dtf3.Offset:{1}  df3.DateTime.Kind:{2}", dtf3, dtf3.Offset, dtf3.DateTime.Kind);
            //output:
            //  dtf1:05/06/2014 10:10:00 +08:00  dtf1.Offset:08:00:00  df1.DateTime.Kind:Unspecified
            //  dtf2:05/15/2014 11:43:28 +08:00  dtf2.Offset:08:00:00  df2.DateTime.Kind:Unspecified
            //  dtf3:05/15/2014 03:43:28 +00:00  dtf3.Offset:00:00:00  df3.DateTime.Kind:Unspecified


TimeZoneInfo(TimeZone的替代)
表示世界上的任何时区。 其中BaseUtcOffset属性为TimeSpan类型,用于获取对象所处时区的标准时间与协调世界时 (UTC) 之间的时差。

            DateTime dt1 = Convert.ToDateTime("2014/05/06 10:10:00");
            TimeZoneInfo tziCN = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time");
            DateTime dt2 = TimeZoneInfo.ConvertTime(dt1, tziCN, TimeZoneInfo.Utc);
            Debug.WriteLine("dt1:{0} \t dt2:{1} \t BaseUtcOffset:{2}", dt1, dt2, tziCN.BaseUtcOffset);
            Debug.WriteLine("id:{0} \t DaylightName:{1} \t DisplayName:{2}", tziCN.Id, tziCN.DaylightName, tziCN.DisplayName);
            //output:
            //  dt1:05/06/2014 10:10:00 	 dt2:05/06/2014 02:10:00 	 BaseUtcOffset:08:00:00
            //  id:China Standard Time 	 DaylightName:中国夏令时 	 DisplayName:(UTC+08:00)北京,重庆,香港特别行政区,乌鲁木齐

            foreach (TimeZoneInfo tzi in TimeZoneInfo.GetSystemTimeZones())
            {
                Debug.WriteLine("id:{0} \t DaylightName:{1} \t DisplayName:{2}", tzi.Id, tzi.DaylightName, tzi.DisplayName);
            }
            // etc..


综上,将某一时区时间转换为UNIX时间有多种方式,但时间、时区或时差是必不可少的参数。

 

TimeSpan 结构 (System)
http://msdn.microsoft.com/zh-cn/library/system.timespan.aspx

DateTime 结构 (System)
http://msdn.microsoft.com/zh-cn/library/system.datetime.aspx

DateTimeOffset 结构 (System)
http://msdn.microsoft.com/zh-cn/library/system.datetimeoffset.aspx

TimeZoneInfo 类 (System)
http://msdn.microsoft.com/zh-cn/library/system.timezoneinfo.aspx

纳秒
http://baike.baidu.com/view/187741.htm?fr=aladdin

 

 

 

没有更多推荐了,返回首页