simpleDateFormat 和 TimeZone
阿新 • • 發佈:2019-02-10
- 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();
}