本文純屬整合,將在項(xiàng)目中用到的UTC時(shí)間和與.NET時(shí)間戳的轉(zhuǎn)換進(jìn)行記錄。
成都創(chuàng)新互聯(lián)自2013年起,先為邛崍等服務(wù)建站,邛崍等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為邛崍企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
1、android獲取UTC時(shí)間
/** * 獲取UTC時(shí)間 * * @return */ public static String getUTCTimeStr() { DateFormat format = new SimpleDateFormat("yyyy/MM/dd/HH/mm/ss"); StringBuffer UTCTimeBuffer = new StringBuffer(); // 1、取得本地時(shí)間: Calendar cal = Calendar.getInstance(); // 2、取得時(shí)間偏移量: int zoneOffset = cal.get(java.util.Calendar.ZONE_OFFSET); // 3、取得夏令時(shí)差: int dstOffset = cal.get(java.util.Calendar.DST_OFFSET); // 4、從本地時(shí)間里扣除這些差量,即可以取得UTC時(shí)間: 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、獲取時(shí)間戳
/** * 獲取時(shí)間戳 * * @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();
/** * 此處的參數(shù)很重要,原則上都是1,日所以為2,是因?yàn)橹暗娜掌跊](méi)減掉1 第三個(gè)參數(shù)為1:日期多了2天,為2則日期多1天 * **/ //上傳失敗時(shí)這里總會(huì)出現(xiàn)混亂的情況,需要找到源頭解決 // 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時(shí)間傳給第二步,即可獲取時(shí)間戳!
對(duì)于時(shí)間戳的解釋?zhuān)覍⒁靡黄恼聛?lái)說(shuō)明,個(gè)人其實(shí)也是在探索中:
java的Date.getTime()轉(zhuǎn)換成C#的Datetime.ticks先來(lái)個(gè)名詞解釋: 然后來(lái)做個(gè)轉(zhuǎn)換: 好了,接下來(lái)是我們的java轉(zhuǎn)換函數(shù) public static long GetTicks(String epochStr) 用圖來(lái)說(shuō)明: | | | 我是分別取得目標(biāo)時(shí)間和0001年到1970年的"millisecond(毫秒) 數(shù)",然后加在一起,這樣就得到了目標(biāo)時(shí)間到0001年的"millisecond(毫秒) 數(shù)",然后把這個(gè)數(shù)字換算成"千萬(wàn)分之一秒"的數(shù)量,得到ticks數(shù). |
注意:.net里確實(shí)是從0001年01月01日開(kāi)始。 不過(guò)歷史上因?yàn)闅v法的轉(zhuǎn)換, 有“丟失的2天”。
個(gè)人在項(xiàng)目中發(fā)現(xiàn)一個(gè)問(wèn)題,calStart.set(1, 1, 3, 0, 0, 0); 這里設(shè)置的時(shí)候會(huì)在不同的時(shí)間發(fā)生不同的變化,導(dǎo)致最后設(shè)置的時(shí)間也也發(fā)生變化,有的系統(tǒng)是從1970/01/01開(kāi)始計(jì)算,有的會(huì)從1970/01/02開(kāi)始,導(dǎo)致我拿到的時(shí)間都不一致,每次出問(wèn)題就需要更改這里的設(shè)置(calStart.set(1, 1, 3, 0, 0, 0))就恢復(fù)正常了,如果有朋友也發(fā)生這樣的問(wèn)題,請(qǐng)分享一下,本人將不甚感激,本人如果研究出來(lái)了也會(huì)更新進(jìn)行分享,謝謝!歡迎探討!