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();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值