1. 程式人生 > >simpleDateFormat 和 TimeZone

simpleDateFormat 和 TimeZone

  • simpleDateFormat用法
 public static String toLongTimeString(Date dt){
        SimpleDateFormat myFmt=new SimpleDateFormat("HH mm ss SSSS");        
        return myFmt.format(dt);
    }
  • 1、通過改變預設的時區
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8:00"));

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"
); System.out.println(sdf.format(Calendar.getInstance()));
  • 2、通過設定SimpleDateFormat的構造引數
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);
System.out.println(sdf.format(new Date());
  • 1.影響TimeZone的因素:
    • 1.作業系統的時區設定。
    • 2.資料傳輸時時區設定。
  • 2.如何設定時區
public static void main
(String[] args) { SimpleDateFormat f1 = new SimpleDateFormat("yyyy-MM-dd"); try { System.out.println(f1.parse("2015-12-12")); f1.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); System.out.println(f1.parse("2015-12-12")); } catch (ParseException e) { e.printStackTrace(); } }
  • 3.時區值大全
 {"ACT", "Australia/Darwin"},
 {"AET", "Australia/Sydney"},
 {"AGT", "America/Argentina/Buenos_Aires"},
 {"ART", "Africa/Cairo"},
 {"AST", "America/Anchorage"},
 {"BET", "America/Sao_Paulo"},
 {"BST", "Asia/Dhaka"},
 {"CAT", "Africa/Harare"},
 {"CNT", "America/St_Johns"},
 {"CST", "America/Chicago"},
 {"CTT", "Asia/Shanghai"},
 {"EAT", "Africa/Addis_Ababa"},
 {"ECT", "Europe/Paris"},
 {"EST", "America/New_York"},
 {"HST", "Pacific/Honolulu"},
 {"IET", "America/Indianapolis"},
 {"IST", "Asia/Calcutta"},
 {"JST", "Asia/Tokyo"},
 {"MIT", "Pacific/Apia"},
 {"MST", "America/Denver"},
 {"NET", "Asia/Yerevan"},
 {"NST", "Pacific/Auckland"},
 {"PLT", "Asia/Karachi"},
 {"PNT", "America/Phoenix"},
 {"PRT", "America/Puerto_Rico"},
 {"PST", "America/Los_Angeles"},
 {"SST", "Pacific/Guadalcanal"},
 {"VST", "Asia/Saigon"}

TimeZone時區

  • 1.獲取預設的TimeZone物件
TimeZone tz = TimeZone.getDefault()
  • 2..使用 getTimeZone(String id) 方法獲取TimeZone物件
// 獲取 “GMT+08:00”對應的時區
TimeZone china = TimeZone.getTimeZone("GMT+:08:00");
// 獲取 “中國/重慶”對應的時區
TimeZone chongqing = TimeZone.getTimeZone("Asia/Chongqing");
  • 3.TimeZone示列
import java.text.DateFormat;
import java.util.Date;
import java.util.TimeZone;

/**
 * TimeZone的測試程式
 */
public class TimeZoneTest {

 public static void main(String[] args) {

 // 測試建立TimeZone物件的3種方法
 showUsageOfTimeZones() ;

 // 測試TimeZone的其它API
 testOtherAPIs() ;

 // 列印getTimeZone(String id)支援的所有id
 //printAllTimeZones() ;
 }


 /**
 * 測試建立TimeZone物件的3種方法
 */
 public static void showUsageOfTimeZones() {
 TimeZone tz;

 // (01) 預設時區
 tz = TimeZone.getDefault();
 printDateIn(tz) ;

 // (02) 設定時區為"GMT+08:00"
 tz = TimeZone.getTimeZone("GMT+08:00");
 printDateIn(tz) ;

 // (03) 設定時區為""
 tz = TimeZone.getTimeZone("Asia/Chongqing");
 printDateIn(tz) ;
 }

 /**
 * 列印 tz對應的日期/時間
 */
 private static void printDateIn(TimeZone tz) {
 // date為2013-09-19 14:22:30
 Date date = new Date(113, 8, 19, 14, 22, 30);
 // 獲取預設的DateFormat,用於格式化Date
 DateFormat df = DateFormat.getInstance();
 // 設定時區為tz
 df.setTimeZone(tz);
 // 獲取格式化後的字串
 String str = df.format(date);

 System.out.println(tz.getID()+" :"+str);
 }

 /**
 * 測試TimeZone的其它API
 */
 public static void testOtherAPIs() {
 // 預設時區
 TimeZone tz = TimeZone.getDefault();

 // 獲取“id”
 String id = tz.getID();

 // 獲取“顯示名稱”
 String name = tz.getDisplayName();

 // 獲取“時間偏移”。相對於“本初子午線”的偏移,單位是ms。
 int offset = tz.getRawOffset();
 // 獲取“時間偏移” 對應的小時
 int gmt = offset/(3600*1000);

 System.out.printf("id=%s, name=%s, offset=%s(ms), gmt=%s\n",
  id, name, offset, gmt);
 }

 /**
 * 列印getTimeZone(String id)支援的所有id
 */
 public static void printAllTimeZones() {

 String[] ids = TimeZone.getAvailableIDs();
 for (String id:ids) {
  //int offset = TimeZone.getTimeZone(avaIds[i]).getRawOffset();
  //System.out.println(i+" "+avaIds[i]+" "+offset / (3600 * 1000) + "\t");
  System.out.printf(id+", ");
 }
 System.out.println();
 }
}

java.util.TimeZone.getOffset()方法例項

  • getOffset(int era,int year,int month,int day,int dayOfWeek,int milliseconds) 方法用於獲取時區偏移量,為當前日期,修改夏令時情況下。這是偏移量新增到UTC以獲取本地時間。
  • 引數

    • era–這是給定日期的年代。
    • year–這是給定日期的年份。
    • month–這是給定日期的月份。
    • day–這是一天中個月的特定日期。
    • dayOfWeek–這是給定日期的周的一天。
    • milliseconds–這是在一天的毫秒標準的本地時間。
  • 返回值

    • 方法呼叫返回偏移量,單位為毫秒新增到GMT以獲取本地時間。
  • eg:
public class TimeZoneDemo {
   public static void main( String args[] ){

      // create time zone object     
      TimeZone timezone = TimeZone.getTimeZone("Europe/Paris");

      // checking offset value       
      System.out.println("Offset value is :" + timezone.getOffset(1, 2011, 2, 2, 2, 300));
   }    
}

本地時間,LocalTime

  • LocalTime是值型別,且跟日期和時區沒有關聯。當我們對時間進行加減操作時,以午夜基準,24小時一個週期。因此,20:00加上6小時,結果就是02:00。
  • LocalTime的用法跟LocalDate相似:
LocalTime time = LocalTime.of(20, 30);
int hour = date.getHour(); // 20
int minute = date.getMinute(); // 30
time = time.withSecond(6); // 20:30:06
time = time.plusMinutes(3); // 20:33:06

時間和日期組合LocalDateTime

  • LocalDateTime可以直接建立,或者組合時間和日期:
LocalDateTime dt1 = LocalDateTime.of(2014, Month.JUNE, 10, 20, 30);
LocalDateTime dt2 = LocalDateTime.of(date, time);
LocalDateTime dt3 = date.atTime(20, 30);
LocalDateTime dt4 = date.atTime(time);
  • ZoneDateTime負責處理面向人類的(檯曆和掛鐘上看到的)時間和麵向機器的時間(始終連續增長的秒數)之間的轉換。因此,你可以通過本地時間或時間點來建立ZoneDateTime例項:
ZoneId zone = ZoneId.of("Europe/Paris");

LocalDate date = LocalDate.of(2014, Month.JUNE, 10);
ZonedDateTime zdt1 = date.atStartOfDay(zone);

Instant instant = Instant.now();
ZonedDateTime zdt2 = instant.atZone(zone);

轉載

/**
     * 根據給定的時間返回對應格式的字串
     *  1、小於一分鐘---"剛剛"
     *  2、大於一分鐘而在本日內的,返回格式為"HH:mm"
     *  3、今年之內而不再本日內,格式為"MM-dd"
     *  4、否則,格式為"yyyy-MM-dd"
     * @param strDate
     * @return
     */
    public static String getFormatDate(String strDate) {
        DateTimeFormatter formatter;
        ZonedDateTime zonedDateTime = ZonedDateTime.parse(strDate);
        if (zonedDateTime.toLocalDate().equals(LocalDate.now())) {
            if (getOverMinutes(strDate) <= 1) {
                return "剛剛";
            } else {
                formatter = DateTimeFormatter.ofPattern("HH:mm", Locale.CHINA);
                return zonedDateTime.format(formatter);
            }
        } else {
            if (zonedDateTime.toLocalDate().getYear() == LocalDate.now().getYear()) {
                formatter = DateTimeFormatter.ofPattern("MM-dd", Locale.CHINA);
            } else {
                formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.CHINA);
            }
            return zonedDateTime.format(formatter);
        }
    }

    /**
     * 將給定的秒數轉換為一段持續時間,如70s,可為01:10
     * @param s
     * @return
     */
    public static String sec2Duration(int s) {
        int sec;
        if (s < 0) {
            return "00:00";
        }
        int min = s / 60;
        if (min < 60) {
            sec = s % 60;
            return unitFormat(min) + ":" + unitFormat(sec);
        } else {
            int hour = min / 60;
            min = min % 60;
            sec = s - hour * 3600 - min * 60;
            return unitFormat(hour) + ":" + unitFormat(min) + ":" + unitFormat(sec);
        }
    }
    public static String unitFormat(int i) {
        return i >= 0 && i < 10 ? "0" + i : i + "";
    }

    /**
     * 給定開始時間,返回還剩多少天多少時多少分的字串陣列
     * @param startTime
     * @return
     */
    public static String[] getLeftStr(String startTime) {
        Instant start = ZonedDateTime.parse(startTime).toInstant();
        long minutes = Duration.between(Instant.now(), start).toMinutes();
        if (minutes < 60 && minutes > 0) {
            return new String[]{"0", "0", minutes + ""};
        } else if (minutes <= 0) {
            return null;
        }
        long hours = minutes / 60;
        if (hours < 60) {
            minutes = minutes % 60;
            return new String[]{"0", hours + "", minutes + ""};
        } else {
            long days = hours / 24;
            hours = hours % 24;
            minutes = minutes - days * 24 * 60 - hours * 60;
            return new String[]{days + "", hours + "", minutes + ""};
        }
    }
    /**
     * 根據建立時間和總共時間得到當前剩餘時間
     * @param createStr
     * @param totalMills
     * @return
     */
    public static long getLeftMills(String createStr, long totalMills) {
        long leftMills = totalMills - getOverMills(createStr);
        return leftMills >= 0 ? leftMills : 0;
    }
    public static long getLeftMinutes(String createStr, long totalMinutes) {
        long leftMinutes = totalMinutes - getOverMinutes(createStr);
        return leftMinutes >= 0 ? leftMinutes : 0;
    }
    public static long getLeftHours(String createStr, long totalHours) {
        long leftHours = totalHours - getOverHours(createStr);
        return leftHours >= 0 ? leftHours : 0;
    }
    /**
     * 根據跟定的時間得到到目前為止過了多少秒
     * @param time
     * @return
     */
    public static long getOverMills(String time){
        return getOverTime(time).toMillis();
    }
    public static long getOverMinutes(String time){
        return getOverTime(time).toMinutes();
    }
    public static long getOverHours(String time){
        return getOverTime(time).toHours();
    }
    private static Duration getOverTime(String time) {
        Instant timeInstant = ZonedDateTime.parse(time).toInstant();
        Instant now = Instant.now();
        return Duration.between(timeInstant, now);
    }

    /**
     * 將UNIX時間戳(秒級)格式化成ZoneDateTime的格式
     */
    public static String format2ZoneDateTimeFromSecond(long timestamp) {
        return ZonedDateTime.ofInstant(Instant.ofEpochSecond(timestamp), ZoneId.of("Asia/Shanghai")).toString();
    }