面试题1 -- Java 中,怎么在格式化的日期中显示时区?
使用SimpleDateFormat来实现格式化日期
import java.text.SimpleDateFormat;
import java.util.Date; public class DateFormatExample { public static void main(String args[]) { Date today = new Date(); System.out.println("今天 is : " + today); SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd-MM-yyyy");
String date = DATE_FORMAT.format(today);
System.out.println("今天 in dd-MM-yyyy format : " + date); DATE_FORMAT = new SimpleDateFormat("dd/MM/yy");
date = DATE_FORMAT.format(today);
System.out.println("今天 in dd/MM/yy pattern : " + date); //formatting Date with time information
DATE_FORMAT = new SimpleDateFormat("dd-MM-yy:HH:mm:SS");
date = DATE_FORMAT.format(today);
System.out.println("今天 in dd-MM-yy:HH:mm:SS : " + date); //SimpleDateFormat example - Date with timezone information
DATE_FORMAT = new SimpleDateFormat("dd-MM-yy:HH:mm:SS Z");
date = DATE_FORMAT.format(today);
System.out.println("今天 in dd-MM-yy:HH:mm:SSZ : " + date); } }
DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中使用,如 将 SimpleDateFormat 限制在 ThreadLocal 中。如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果。因此,从日期、时间处理的所有实践来说,我强力推荐 joda-time 库。
Joda-Time
主要的特点包括:
1. 易于使用:Calendar让获取"正常的"的日期变得很困难,使它没办法提供简单的方法,而Joda-Time能够 直接进行访问域并且索引值1就是代表January。
2. 易于扩展:JDK支持多日历系统是通过Calendar的子类来实现,这样就显示的非常笨重而且事实 上要实现其它日历系统是很困难的。Joda-Time支持多日历系统是通过基于Chronology类的插件体系来实现。
3. 提供一组完整的功能:它打算提供 所有关系到date-time计算的功能.Joda-Time当前支持8种日历系统,而且在将来还会继续添加,有着比JDK Calendar更好的整体性能等等。
封装joda-time的时间工具类:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TimeZone; import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;
import org.joda.time.DateTimeZone;
import org.joda.time.Days;
import org.joda.time.LocalDate; import com.sun.istack.internal.Nullable; /**
* 使用joda的时间工具类
* @author soyoungboy
*
*/
public class DateUtils { public static final long SECOND = 1000; // 1秒 java已毫秒为单位 public static final long MINUTE = SECOND * 60; // 一分钟 public static final long HOUR = MINUTE * 60; // 一小时 public static final long DAY = HOUR * 24; // 一天 public static final long WEEK = DAY * 7; // 一周 public static final long YEAR = DAY * 365; // 一年 public static final String FORMAT_TIME = "yyyy-MM-dd HH:mm:ss"; // 默认时间格式 public static final String FORMAT_TIME_MINUTE = "yyyy-MM-dd HH:mm"; // 默认时间格式 public static final String FORTER_DATE = "yyyy-MM-dd"; // 默认日期格式 private static final Map<Integer, String> WEEK_DAY = new HashMap<Integer, String>();
static {
WEEK_DAY.put(7, "星期六");
WEEK_DAY.put(1, "星期天");
WEEK_DAY.put(2, "星期一");
WEEK_DAY.put(3, "星期二");
WEEK_DAY.put(4, "星期三");
WEEK_DAY.put(5, "星期四");
WEEK_DAY.put(6, "星期五");
} /**
* 获取当前系统时间
*
* @return yyyy-MM-dd HH:mm:ss
*/
public static String getCurrentTime() {
DateTime dt = new DateTime();
String time = dt.toString(FORMAT_TIME);
return time;
} /**
* 获取系统当前时间按照指定格式返回
*
* @param pattern
* yyyy/MM/dd hh:mm:a
* @return
*/
public static String getCurrentTimePattern(String pattern) {
DateTime dt = new DateTime();
String time = dt.toString(pattern);
return time;
} /**
* 获取当前日期
*
* @return
*/
public static String getCurrentDate() {
DateTime dt = new DateTime();
String date = dt.toString(FORTER_DATE);
return date;
} /**
* 获取当前日期按照指定格式
*
* @param pattern
* @return
*/
public static String getCurrentDatePattern(String pattern) {
DateTime dt = new DateTime();
String date = dt.toString(pattern);
return date;
} /**
* 按照时区转换时间
*
* @param date
* @param timeZone
* 时区
* @param parrten
* @return
*/
@Nullable
public static String format(Date date, TimeZone timeZone, String parrten) {
if (date == null) {
return null;
}
SimpleDateFormat sdf = new SimpleDateFormat(parrten);
sdf.setTimeZone(timeZone);
return sdf.format(date);
} /**
* 获取指定时间
*
* @param year
* 年
* @param month
* 月
* @param day
* 天
* @param hour
* 小时
* @param minute
* 分钟
* @param seconds
* 秒
* @return yyyy-MM-dd HH:mm:ss
*/
public static String getPointTime(Integer year, Integer month, Integer day, Integer hour, Integer minute,
Integer seconds) {
DateTime dt = new DateTime(year, month, day, hour, minute, seconds);
String date = dt.toString(FORMAT_TIME);
return date;
} /**
*
* @param year
* 年
* @param month
* 月
* @param day
* 天
* @param hour
* 小时
* @param minute
* 分钟
* @param seconds
* 秒
* @param parrten
* 自定义格式
* @return parrten
*/
public static String getPointTimePattern(Integer year, Integer month, Integer day, Integer hour, Integer minute,
Integer seconds, String parrten) {
DateTime dt = new DateTime(year, month, day, hour, minute, seconds);
String date = dt.toString(parrten);
return date;
} /**
* 获取指定日期
*
* @param year
* @param month
* @param day
* @return
*/
public static String getPointDate(Integer year, Integer month, Integer day) {
LocalDate dt = new LocalDate(year, month, day);
String date = dt.toString(FORTER_DATE);
return date;
} /**
* 获取指定日期 返回指定格式
*
* @param year
* @param month
* @param day
* @param parrten
* @return
*/
public static String getPointDatParrten(Integer year, Integer month, Integer day, String parrten) {
LocalDate dt = new LocalDate(year, month, day);
String date = dt.toString(parrten);
return date;
} /**
* 获取当前是一周星期几
*
* @return
*/
public static String getWeek() {
DateTime dts = new DateTime();
String week = null;
switch (dts.getDayOfWeek()) {
case DateTimeConstants.SUNDAY:
week = "星期日";
break; case DateTimeConstants.MONDAY:
week = "星期一";
break; case DateTimeConstants.TUESDAY:
week = "星期二";
break;
case DateTimeConstants.WEDNESDAY:
week = "星期三";
break;
case DateTimeConstants.THURSDAY:
week = "星期四";
break;
case DateTimeConstants.FRIDAY:
week = "星期五";
break;
case DateTimeConstants.SATURDAY:
week = "星期六";
default:
break;
}
return week;
} /**
* 获取指定时间是一周的星期几
*
* @param year
* @param month
* @param day
* @return
*/
public static String getWeekPoint(Integer year, Integer month, Integer day) {
LocalDate dts = new LocalDate(year, month, day);
String week = null;
switch (dts.getDayOfWeek()) {
case DateTimeConstants.SUNDAY:
week = "星期日";
break;
case DateTimeConstants.MONDAY:
week = "星期一";
break;
case DateTimeConstants.TUESDAY:
week = "星期二";
break;
case DateTimeConstants.WEDNESDAY:
week = "星期三";
break;
case DateTimeConstants.THURSDAY:
week = "星期四";
break;
case DateTimeConstants.FRIDAY:
week = "星期五";
break;
case DateTimeConstants.SATURDAY:
week = "星期六";
break; default:
break;
}
return week;
} /**
* 格式化日期
*
* @param date
* @return yyyy-MM-dd HH:mm:ss
*/
@Nullable
public static String format(Date date) {
if (date == null) {
return null;
}
SimpleDateFormat format = new SimpleDateFormat(FORMAT_TIME);
return format.format(date);
} /**
* 格式化日期字符串
*
* @param date
* 日期
* @param pattern
* 日期格式
* @return
*/
@Nullable
public static String format(Date date, String pattern) {
if (date == null) {
return null;
}
SimpleDateFormat format = new SimpleDateFormat(pattern);
return format.format(date);
} /**
* 解析日期
*
* @param date
* 日期字符串
* @param pattern
* 日期格式
* @return
*/
@Nullable
public static Date parse(String date, String pattern) {
if (date == null) {
return null;
}
Date resultDate = null;
try {
resultDate = new SimpleDateFormat(pattern).parse(date);
} catch (ParseException e) { }
return resultDate;
} /**
* 解析日期yyyy-MM-dd HH:mm:ss
*
* @param date
* 日期字符串
* @return
*/
@Nullable
public static Date parse(String date) {
if (date == null) {
return null;
} try {
return new SimpleDateFormat(FORMAT_TIME).parse(date);
} catch (ParseException e) {
return null;
}
} /**
* 解析日期 yyyy-MM-dd HH:mm:ss
*
* @param timestamp
* @return
*/
public static String format(Long timestamp, String pattern) {
String dateStr = "";
if (null == timestamp || timestamp.longValue() < 0) {
return dateStr;
}
try {
Date date = new Date(timestamp);
SimpleDateFormat format = new SimpleDateFormat(pattern);
dateStr = format.format(date);
} catch (Exception e) {
// ignore
} return dateStr;
} /**
* 解析日期 yyyy-MM-dd HH:mm:ss
*
* @param timestamp
* @return
*/
public static String format(Long timestamp) {
String dateStr = "";
if (null == timestamp || timestamp.longValue() < 0) {
return dateStr;
}
try {
Date date = new Date(timestamp);
SimpleDateFormat format = new SimpleDateFormat(FORMAT_TIME);
dateStr = format.format(date);
} catch (Exception e) {
// ignore
} return dateStr;
} /**
* 获取当前时间前几天时间,按指定格式返回
*
* @param days
* @return
*/
public static String forwardDay(Integer days, String format) {
DateTime dt = new DateTime();
DateTime y = dt.minusDays(days);
return y.toString(format);
} /**
* 获取当前时间前几天时间
*
* @param days
* @return
*/
public static Date forwardDay(Integer days) {
DateTime dt = new DateTime();
DateTime y = dt.minusDays(days);
return y.toDate();
} /**
* 获取指定时间之后或者之前的某一天00:00:00 默认返回当天
*
* @param days
* @return
*/
public static Date day00(Integer days, String date, String zimeZone) throws Throwable {
DateTime dt;
TimeZone timeZone;
try {
if (isBlank(zimeZone)) {
timeZone = TimeZone.getDefault();
} else {
timeZone = TimeZone.getTimeZone(zimeZone);
}
if (isBlank(date)) {
dt = new DateTime().withZone(DateTimeZone.forTimeZone(timeZone)).toLocalDateTime().toDateTime();
} else {
dt = new DateTime(date).withZone(DateTimeZone.forTimeZone(timeZone)).toLocalDateTime().toDateTime();
}
} catch (Exception e) {
throw new Throwable(e);
} DateTime y = dt.minusDays(days).withHourOfDay(0).withMinuteOfHour(0).withSecondOfMinute(0);
return y.toDate();
} /**
* 获取指定时间之后或者之前的某一天23:59:59 默认返回当天
*
* @param days
* 偏移量
* @return
*/
public static Date day59(Integer days, String date, String zimeZone) throws Throwable {
DateTime dt;
TimeZone timeZone;
try {
if (isBlank(zimeZone)) {
timeZone = TimeZone.getDefault();
} else {
timeZone = TimeZone.getTimeZone(zimeZone);
}
if (isBlank(date)) { dt = new DateTime().withZone(DateTimeZone.forTimeZone(timeZone)).toLocalDateTime().toDateTime();
} else {
dt = new DateTime(date).withZone(DateTimeZone.forTimeZone(timeZone)).toLocalDateTime().toDateTime();
}
} catch (Exception e) {
throw new Throwable(e);
}
DateTime y = dt.minusDays(days).withHourOfDay(23).withMinuteOfHour(59).withSecondOfMinute(59);
return y.toDate();
} /**
* 计算两个时间相差多少天
*
* @param startDate
* @param endDate
* @return
*/
@Nullable
public static Integer diffDay(Date startDate, Date endDate) {
if (startDate == null || endDate == null) {
return null;
}
DateTime dt1 = new DateTime(startDate);
DateTime dt2 = new DateTime(endDate);
int day = Days.daysBetween(dt1, dt2).getDays();
return Math.abs(day);
} /**
* 获取某月之前,之后某一个月最后一天,24:59:59
*
* @return
*/
public static Date lastDay(Date date, Integer month) {
DateTime dt1;
if (month == null) {
month = 0;
}
if (date == null) {
dt1 = new DateTime().minusMonths(month);
} else {
dt1 = new DateTime(date).minusMonths(month);
}
DateTime lastDay = dt1.dayOfMonth().withMaximumValue().withHourOfDay(23).withMinuteOfHour(59)
.withSecondOfMinute(59);
return lastDay.toDate();
} /**
* 获取某月月之前,之后某一个月第一天,00:00:00
*
* @return
*/
public static Date firstDay(Date date, Integer month) {
DateTime dt1;
if (month == null) {
month = 0;
}
if (date == null) {
dt1 = new DateTime().minusMonths(month);
} else {
dt1 = new DateTime(date).minusMonths(month);
}
DateTime lastDay = dt1.dayOfMonth().withMinimumValue().withHourOfDay(0).withMinuteOfHour(0)
.withSecondOfMinute(0);
return lastDay.toDate();
} public static Date addDay(Date date, int offset) {
DateTime dt1;
if (date == null) {
dt1 = new DateTime().plusDays(offset);
return dt1.toDate();
}
dt1 = new DateTime(date).plusDays(offset);
return dt1.toDate(); } /**
* 传入日期时间与当前系统日期时间的比较, 若日期相同,则根据时分秒来返回 , 否则返回具体日期
*
* @return 日期或者 xx小时前||xx分钟前||xx秒前
*/
@Nullable
public static String getNewUpdateDateString(Date now, Date createDate) {
if (now == null || createDate == null) {
return null;
}
Long time = (now.getTime() - createDate.getTime());
if (time > (24 * 60 * 60 * 1000)) {
return time / (24 * 60 * 60 * 1000) + "天前";
} else if (time > (60 * 60 * 1000)) {
return time / (60 * 60 * 1000) + "小时前";
} else if (time > (60 * 1000)) {
return time / (60 * 1000) + "分钟前";
} else if (time >= 1000) {
return time / 1000 + "秒前";
}
return "刚刚";
}
/**
*
* @Title: isBlank
* @Description: TODO(判断字符串是否为空或长度为0 或由空格组成)
* @param @param str
* @param @return 设定文件
* @return boolean 返回类型
* @throws
*/
public static boolean isBlank(String str) {
return (str == null || str.trim().length() == 0);
} public static void main(String[] args) throws Throwable {
System.out.println(lastDay(new Date(),2));
System.out.println(firstDay(null,0));
TimeZone zone1=TimeZone.getTimeZone("GMT+8");
TimeZone zone2=TimeZone.getTimeZone("GMT-5");
System.out.println(format(new Date(),zone1,FORMAT_TIME));
System.out.println(format(new Date(),zone2,FORMAT_TIME)); System.out.println(format(day00(0,"2017-5-11","GMT+0")));
System.out.println(format(day00(0,"2017-5-11","GMT+8")));
System.out.println(format(day00(0,"2017-5-11","GMT-8")));
Date date1 =parse("2017-05-11 17:53:52"); System.out.println(diffDay(date1,new Date())); DateTime dateTime = new DateTime().withDayOfWeek(1); DateTime dateTime1 = new DateTime().withDayOfWeek(7).withTime(0, 0,
0, 0);
System.out.println(format(dateTime.toDate())); System.out.println(format(dateTime1.toDate())); System.out.println(format(new Date(), "MM/dd"));
} }
其中测试代码结果:
Fri Jun 30 23:59:59 GMT+08:00 2017
Tue Aug 01 00:00:00 GMT+08:00 2017
2017-08-28 19:47:28
2017-08-28 06:47:28
2017-05-10 00:00:00
2017-05-11 00:00:00
2017-05-10 00:00:00
109
2017-08-28 19:47:29
2017-09-03 00:00:00
08/28
面试题1 -- Java 中,怎么在格式化的日期中显示时区?的更多相关文章
- java笔记--String类格式化当天日期转换符文档
String类格式化当天日期 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3877389.html "谢谢-- 转换符:% ...
- Java中对整数格式化
Java中对整数格式化 1.说明 对整数进行格式化:%[index$][标识][最小宽度]转换方式 2.实例分析 (1)源码 /** * 1. 对整数进行格式化:%[index$][标识][最小 ...
- Java面试题:Java中怎么样实现多线程
方法一:继承 Thread 类,覆盖方法 run(),我们在创建的 Thread 类的子类中重写 run() ,加入线程所要执行的代码即可. 下面是一个例子: public class MyThrea ...
- JAVA面试题 浅析Java中的static关键字
面试官Q1:请说说static关键字,你在项目中是怎么使用的? static 关键字可以用来修饰:属性.方法.内部类.代码块: static 修饰的资源属于类级别,是全体对象实例共享的资源: 使用 s ...
- Java中数字的格式化输出
Java中数字的格式化输出 double d = 345.678; String s = "hello!"; int i = 1234; //"%"表示进行格式 ...
- 各大公司Java面试题收录含答案(整理版)持续中....
本文分为17个模块,分别是:Java基础.容器.多线程.反射.对象拷贝.Java web.异常.网络.设计模式.算法.Spring/Spring MVC.Spring Boot/Spring Clou ...
- 面试题:Java中为什么只有值传递?
作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功.JAVA底层.面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」 目录 经典的问题 形参&实参 Java是 ...
- [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...
- 转!!Java代码规范、格式化和checkstyle检查配置文档
为便于规范各位开发人员代码.提高代码质量,研发中心需要启动代码评审机制.为了加快代码评审的速度,减少不必要的时间,可以加入一些代码评审的静态检查工具,另外需要为研发中心配置统一的编码模板和代码格式化模 ...
随机推荐
- JS笔记一:动态修改css样式
---恢复内容开始--- 最近在学习CSS/JS的样式,两个合学习一起学习,加深JS的书写和了解. 一.通过Javasript修改图片大小 通过函数来传递图片id,height,width,使用doc ...
- C# 实现语音听写
本文系原创,禁止转载. 分享如何使用c#对接科大讯飞语音听写服务,简单高效地实现语音听写. 实现语音听写主要分为录音和语音识别两部分:录音是指获取设备声卡端口的音频数据并将之保存为音频文件,语音识别就 ...
- 流畅python学习笔记:第十一章:抽象基类
__getitem__实现可迭代对象.要将一个对象变成一个可迭代的对象,通常都要实现__iter__.但是如果没有__iter__的话,实现了__getitem__也可以实现迭代.我们还是用第一章扑克 ...
- Windows 10 IoT Serials 9 – 如何利用IoTCoreAudioControlTool改变设备的音频设备
大家知道,在Windows 10 IoT Core上,如果用户外接了USB声卡.带有麦克风的摄像头之类的硬件,就会有多个音频设备可以用.但是,系统目前并没有提供直接的UI来设置音频的输入或者输出设备. ...
- (转)Eclipse快捷键 10个最有用的快捷键
1 Eclipse中10个最有用的快捷键组合 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到提升. 1 ...
- zTree新增的根结点再新增子节点reAsyncChildNodes不生效解决方案
zTree新增的根结点再新增子节点reAsyncChildNodes不生效解决方案, zTree新的根结点不能异步刷新,reAsyncChildNodes不生效解决方案, reAsyncChildNo ...
- java 常见数据结构
1)tree 2) queue 3) list 4) stack 5) heap 6) map
- Spring-Framework 源码阅读之AnnotationBeanUtils
Java程序员,就是要学会一个名字叫做"春"的东西,这玩意运用的非常的广泛,现在如果你的业务系统或者软件没有在这个东西上开发,都不要意思拿出来.因为你更不上时代了.在平时的工作的中 ...
- java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I
今天使用hql语句的时候,遇到了一个这样的bug,修改的方法是
- WMware虚拟机NAT模式配置网络设置Linux虚拟机固定IP
一.主机配置 1.查看本机ip 2.给vmnet8设置固定IP和网段 3.根据vmnet8网段设置VMware NAT模式网段 4.点击NAT设置网关 二.启动虚拟机 网络设置如下: 这个地址值在这个 ...