android 获取UTC时间和与.net时间戳的转换

本文纯属整合,将在项目中用到的UTC时间和与.NET时间戳的转换进行记录。

1、android获取UTC时间


/**

* 获取UTC时间

*

* @return

*/

public static String getUTCTimeStr() {

DateFormat format = new SimpleDateFormat("yyyy/MM/dd/HH/mm/ss");

StringBuffer UTCTimeBuffer = new StringBuffer();

// 1、取得本地时间:

Calendar cal = Calendar.getInstance();

// 2、取得时间偏移量:

int zoneOffset = cal.get(java.util.Calendar.ZONE_OFFSET);

// 3、取得夏令时差:

int dstOffset = cal.get(java.util.Calendar.DST_OFFSET);

// 4、从本地时间里扣除这些差量,即可以取得UTC时间:

cal.add(java.util.Calendar.MILLISECOND, -(zoneOffset + dstOffset));

int year = cal.get(Calendar.YEAR);

int month = cal.get(Calendar.MONTH) + 1;

int day = cal.get(Calendar.DAY_OF_MONTH);

int hour = cal.get(Calendar.HOUR_OF_DAY);

int minute = cal.get(Calendar.MINUTE);

int second = cal.get(Calendar.SECOND);

UTCTimeBuffer.append(year).append("/").append(month).append("/")

.append(day);

UTCTimeBuffer.append("/").append(hour).append("/").append(minute)

.append("/").append(second);

try {

format.parse(UTCTimeBuffer.toString());

return UTCTimeBuffer.toString();

} catch (ParseException e) {

e.printStackTrace();

} catch (java.text.ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return null;

}

只需直接拷贝去使用即可。

2、获取时间戳


/**

* 获取时间戳

*

* @param dateCur

* @return

*/

public static long GetTicks(String dateCur) {

// convert the target-epoch time to a well-format string

// String date = new java.text.SimpleDateFormat("yyyy/MM/dd/HH/mm/ss")

// .format(new Date(Long.parseLong(epochStr)));

// SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/HH/mm/ss");

// String dateCur = sdf.format(new Date());

String[] ds = dateCur.split("/");

// start of the ticks time

Calendar calStart = Calendar.getInstance();

/**

* 此处的参数很重要,原则上都是1,日所以为2,是因为之前的日期没减掉1 第三个参数为1:日期多了2天,为2则日期多1天

* **/

//上传失败时这里总会出现混乱的情况,需要找到源头解决

// calStart.set(1, 1, 0, 0, 0, 0);

calStart.set(1, 1, 3, 0, 0, 0);

// the target time

Calendar calEnd = Calendar.getInstance();

calEnd.set(Integer.parseInt(ds[0]), Integer.parseInt(ds[1]),

Integer.parseInt(ds[2]), Integer.parseInt(ds[3]),

Integer.parseInt(ds[4]), Integer.parseInt(ds[5]));

// epoch time of the ticks-start time

long epochStart = calStart.getTime().getTime();

// epoch time of the target time

long epochEnd = calEnd.getTime().getTime();

// get the sum of epoch time, from the target time to the ticks-start

// time

long all = epochEnd - epochStart;

// convert epoch time to ticks time

long ticks = ((all / 1000) * 1000000) * 10;

return ticks;

}

将第一步获取的UTC时间传给第二步,即可获取时间戳!

对于时间戳的解释,我将引用一篇文章来说明,个人其实也是在探索中:

java的Date.getTime()转换成C#的Datetime.ticks

先来个名词解释:
Epoch time:指从1970年1月1日零时起到现在为止的"second(秒) 数".
注意我给"second(秒) 数"加了引号,是因为在不一样的项目中,计量单位可能是不同的,需要仔细的阅读相关文档.比如Gtalk Api的Gmail Notifications文档中,所使用的date数为从1970年1月1日零时起到现在为止的"millisecond(毫秒) 数".
C#的Datetime.ticks:指从0001年1月1日零时起到现在为止的one ten-millionth of a second数量,或者one hundred nanoseconds of a second数量,也就是"千万分之一秒"的数量.
java的Date.getTime():这个方法返回目标时间到1970年1月1日零时为止的"millisecond(毫秒) 数".

然后来做个转换:
1 second(秒)=1000 millisecond(毫秒)=10 x 100 0000 one ten-millionth of a second(千万分之一秒)

好了,接下来是我们的java转换函数

public static long GetTicks(String epochStr)
 {
  //convert the target-epoch time to a well-format string
   String date = new java.text.SimpleDateFormat("yyyy/MM/dd/HH/mm/ss").format(new Date (Long.parseLong(epochStr)));
   String[] ds=date.split("/");
     
   //start of the ticks time
  Calendar calStart=Calendar.getInstance();
  calStart.set(1, 1, 3, 0, 0, 0);
  
  //the target time
  Calendar calEnd=Calendar.getInstance();
  calEnd.set(Integer.parseInt(ds[0]) ,Integer.parseInt(ds[1]),Integer.parseInt(ds[2]),Integer.parseInt(ds[3]),Integer.parseInt(ds[4]),Integer.parseInt(ds[5]) );
  
  //epoch time of the ticks-start time
  long epochStart=calStart.getTime().getTime();
  //epoch time of the target time
  long epochEnd=calEnd.getTime().getTime();
  
  //get the sum of epoch time, from the target time to the ticks-start time
   long all=epochEnd-epochStart;    
   //convert epoch time to ticks time
      long ticks=( (all/1000) * 1000000) * 10;
     
      return ticks;
 }

用图来说明:

|       |         |
目标时间  1970年    0001年

我是分别取得目标时间和0001年到1970年的"millisecond(毫秒) 数",然后加在一起,这样就得到了目标时间到0001年的"millisecond(毫秒) 数",然后把这个数字换算成"千万分之一秒"的数量,得到ticks数.
或许你会发现,为什么0001年的计算从1月3号起,不是应该1月1号吗.这个问题我也很奇怪,因为我发现如果从1月1号起,时间上就总是差着两天,这原因等待高手来解决 :)

注意:.net里确实是从0001年01月01日开始。 不过历史上因为历法的转换, 有“丢失的2天”。

个人在项目中发现一个问题,calStart.set(1, 1, 3, 0, 0, 0);  这里设置的时候会在不同的时间发生不同的变化,导致最后设置的时间也也发生变化,有的系统是从1970/01/01开始计算,有的会从1970/01/02开始,导致我拿到的时间都不一致,每次出问题就需要更改这里的设置(calStart.set(1, 1, 3, 0, 0, 0))就恢复正常了,如果有朋友也发生这样的问题,请分享一下,本人将不甚感激,本人如果研究出来了也会更新进行分享,谢谢!欢迎探讨!

时间: 2024-10-25 05:52:17

android 获取UTC时间和与.net时间戳的转换的相关文章

C# 获取utc时间,以及utc datetime 互相转化

C# 获取utc时间,以及utc datetime 互相转化 大部分源于http://blog.sina.com.cn/s/blog_4c6e822d0102dsdz.html 刚开始学习一点C#知识,研究一下UTC时间获取,如下 DateTime dt = DateTime.UtcNow; 另: DateTime.UtcNow.ToString()输出的是0时区的事件, DateTime.Now.ToString()输出的是当前时区的时间,我们中国使用的是东八区的时间,所以差8个小时 以下是互

Android获取系统时间方法详解

Android获取系统时间方法的方法有很多种,常用的有Calendar.Date.currentTimeMills等方法. (1)Calendar Calendar获取系统时间首先要用Calendar.getInstance()函数获取一个实例,再为该实例设定时区(中国的时区为GMT+8:00),最后使用Calendar.get()函数获取时间的具体信息,如年,月,日,小时,分,秒,星期几. package com.hzhi.time_example; import java.util.Cale

Android获取当前时间的android.text.format.Time已过时

之前使用的 Time time = new android.text.format.Time(); time.setToNow(); String timeNow = time.format("%Y%m%d%H%M%S"); 来获取当前时间,但是在android22中提示过时 deprecated 然后找了下,实在不知道用哪个好,只好试试这个 Calendar calendar = Calendar.getInstance(); String timeNow = new SimpleD

Android 获取系统时间

[java] view plaincopyprint? import    java.text.SimpleDateFormat; SimpleDateFormat    formatter    =   new    SimpleDateFormat    ("yyyy年MM月dd日    HH:mm:ss     "); Date    curDate    =   new    Date(System.currentTimeMillis());//获取当前时间 String  

Android获取系统时间yyyyMMddHHmmssSSS

代码改变世界 public String testTime1() throws ParseException { String DEFAULT_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"; //设置时间的格式 // yyyy-MM-dd 1969-12-31 // yyyy-MM-dd 1970-01-01 // yyyy-MM-dd HH:mm 1969-12-31 16:00 // yyyy-MM-dd HH:mm 1970-01-01 0

Python时间,日期,时间戳之间转换

#1.将字符串的时间转换为时间戳方法: a = "2013-10-10 23:40:00" #将其转换为时间数组 import time timeArray = time.strptime(a, "%Y-%m-%d %H:%M:%S") # 转换为时间戳: timeStamp = int(time.mktime(timeArray)) timeStamp == 1381419600 # 字符串格式更改如a = "2013-10-10 23:40:00&qu

Android获取当前时间的3中方法总结

今天听了一在线公开课,任务是做一个数字时钟,其中最关键的自然是获取当前的系统时间.做个简单的记录,如下: 1. Time time = new Time("GMT+8"); time.setToNow(); //Sets the time of the given Time object to the current time. 将事件获取对象置为当前时间 System.out.println(time.hour); System.out.println(time.minute); S

Android 获取当前时间问题1

获取的写法如下: Calendar c = Calendar.getInstance();//可以对每个时间域单独修改 int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); 查了这里获取的年是对的,其它 包括 DAY,时分秒 都是对的. 就只有月份少一 查看api后发现 月份是从0开始计数的 也就是 它返回的是常量值,从0到11最好对应Calendar.JANUARY,Calendar.FEBUARY,Calend

Android获取当前时间与星期几

public class DataString { private static String mYear; private static String mMonth; private static String mDay; private static String mWay; public static String StringData(){ final Calendar c = Calendar.getInstance(); c.setTimeZone(TimeZone.getTimeZ