Java中的時間處理遇到的問題

2021-09-01 18:59:58 字數 2673 閱讀 8098

最近在做乙個與時間處理相關的開發,需要在進入某個畫面的時候在js中進行倒計時,用以實現特定的功能。在進入到這個畫面之前,需要在該畫面的初始化action中計算出倒計時的時間值interval。

我從資料庫中得到乙個訂單生成時間(使用者端時間,string型別),先轉成date型別。然後再取現在action中的當前時間,然後用date的gettime()方法取的兩個時間差,就得到了這條訂單從生成到現在已經經過的時間time_1,然後再拿「訂單允許操作」的時間time_2減去time_1就得到了倒計時時間interval。接著跳轉到畫面後,以該「倒計時時間interval」作為初始值,用js進行倒計時,以完成特定功能。

功能算是完成了,但是稍微測試一下就發現,上面的倒計時時間計算一直有問題。經過調查找到了發成問題的原因:

訂單的生成時間由db(db部署在pc_a上)產生,用於畫面表示的時候,還要轉化成客戶端的時間(這裡是根據配置檔案裡中的客戶端時區進行轉化),而這個時間也是上面說到的「訂單生成時間(使用者端時間,string型別)」。web系統部署在電腦pc_b上,當前時間的獲取是由web系統中的action完成。由於pc_a與pc_b在時間值和時區上存在差別,同時訂單生成時間(使用者端時間,string型別)」對應的時區與pc_b也不一致,就導致了上面時間差計算的問題。而我所面臨的問題是pc_a與pc_b電腦的時區一致,但時間值不一致,同時訂單生成時間(使用者端時間,string型別)」對應的時區與pc_b也不一致。

因此,根據上面的分析,我在計算倒計時時間時就需要考慮到pc_apc_b時間值的偏差,以及訂單生成時間(使用者端時間,string型別)」的時區轉換。由於是開發環境,導致了「pc_apc_b」存在時間偏差的發生,這裡設定了乙個引數,為兩台電腦的時間偏差,用於修正倒計時時間。

訂單生成時間(使用者端時間,string型別)」的時區轉換方法如下:

// 該時間為東8區的時間

string orderreceiptfrontdate = "2013-07-23 12:12:12";

// 配置源時間格式

******dateformat dbformat = new ******dateformat("yyyy-mm-dd hh:mm:ss",new local("zh","cn"));

dbformat.settimezone(timezone.gettimezone("asia/shanghai"));

dbformat.setlenient(false);

// date內建的時區引數與系統有關係,本人當前系統的時區是東9區,

// 因此該date反映的是東9區時間

date orderreceiptdate = null;

trycatche(parseexception e)

// 通過以上方式,就能把orderreceiptfrontdate所表示的東8區時間,自動轉換為

// 東9區的時間物件date orderreceiptdate

時間差計算的方法如下:

// 換算成同一時區下pc_a與pc_b的偏差時間,用於倒計時時間的修正

string deviationtime_str = ... /* 讀取配置檔案中的數值,可以為負數,單位為秒 */

long deviationtime = 0l;

trycatch(numberformatexception e)

// 訂單允許操作時間,從訂單生成的時間開始計算,單位秒

string invalidtime_str = ... /* 讀取配置檔案中的數值,正整數,單位為秒 */

long invalidtime = 0l;

trycatch(numberformatexception e)

/*按照上面的轉化方式,將

string orderreceiptfrontdate = "2013-07-23 12:12:12"; // 東八區時間

轉化換為當前系統所在時區的時間,得到東9區的時間物件 date orderreceiptdate

*/// 獲取系統當前時間

date now = new date();

// 計算倒計時時間

long lasttime = invalidtime - (now.gettime()/1000l - orderreceiptfrontdate.gettime()/1000l)

+ deviationtime;

把上面計算得到的lasttime傳到畫面,就可以執行有特定需要的倒計時功能了。

Java 開發中遇到的亂碼問題

unicode的空間分配 以下unicode區位碼均以16進製表示 unicode的前256個字元和iso 8859 1 西歐字母 完全相同,其中前半段就是ascii u 0000到u 00ff 每個iso 8859 1碼前面補上乙個空byte 0x00 後才是相應的unicode碼。和我們切身相關...

Java中的時間日期處理

1 精確到毫秒 date 的文字 日期 2 精確到天 calendar 的文字 日期 3 精確到毫秒 date 的日期 文字 4 精確到天 calendar 的日期 文字 當然了 calendar也是可以精確到秒的,比如 set功能 2008年5月12日 星期一 14時28分04秒 calendar...

js中自己遇到的時間處理方式

1 將字串時間格式化成日期 時間中一位兩位造成的擷取錯誤可以這樣避免 varstarttimestr 2017 08 19 09 00 00 var endtimestr 2017 08 19 9 0 0 roomid classroomid 2017 05 19 10 00 00 將caleven...