使用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 中,怎么在格式化的日期中显示时区?的更多相关文章

  1. java笔记--String类格式化当天日期转换符文档

    String类格式化当天日期 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3877389.html "谢谢-- 转换符:% ...

  2. Java中对整数格式化

    Java中对整数格式化 1.说明    对整数进行格式化:%[index$][标识][最小宽度]转换方式 2.实例分析 (1)源码 /** * 1. 对整数进行格式化:%[index$][标识][最小 ...

  3. Java面试题:Java中怎么样实现多线程

    方法一:继承 Thread 类,覆盖方法 run(),我们在创建的 Thread 类的子类中重写 run() ,加入线程所要执行的代码即可. 下面是一个例子: public class MyThrea ...

  4. JAVA面试题 浅析Java中的static关键字

    面试官Q1:请说说static关键字,你在项目中是怎么使用的? static 关键字可以用来修饰:属性.方法.内部类.代码块: static 修饰的资源属于类级别,是全体对象实例共享的资源: 使用 s ...

  5. Java中数字的格式化输出

    Java中数字的格式化输出 double d = 345.678; String s = "hello!"; int i = 1234; //"%"表示进行格式 ...

  6. 各大公司Java面试题收录含答案(整理版)持续中....

    本文分为17个模块,分别是:Java基础.容器.多线程.反射.对象拷贝.Java web.异常.网络.设计模式.算法.Spring/Spring MVC.Spring Boot/Spring Clou ...

  7. 面试题:Java中为什么只有值传递?

    作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功.JAVA底层.面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」 目录 经典的问题 形参&实参 Java是 ...

  8. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  9. 转!!Java代码规范、格式化和checkstyle检查配置文档

    为便于规范各位开发人员代码.提高代码质量,研发中心需要启动代码评审机制.为了加快代码评审的速度,减少不必要的时间,可以加入一些代码评审的静态检查工具,另外需要为研发中心配置统一的编码模板和代码格式化模 ...

随机推荐

  1. maven-配置文件配置src/resource下的文件

    classpath*:只找到applicationContext.xml classpath:/找到了所有

  2. 快速搞定selenium grid分布式

    写这篇文章,似乎有点重复造轮子的嫌疑.当看了几篇相关文章后,我还是决定把半年前的半成品给完成了. 以传统的方式部署分布式Selenium Grid集群需要耗费大量时间和机器成本来准备测试环境. Sna ...

  3. 【PHP】数组用法(转)

    摘要: 说明数组遍历方法foreach,while,for,推荐使用foreach(PHP内部实现,简单速度最快,还可以遍历类属性).以及一些常用方法current,prev,next,end,key ...

  4. 相对路径&绝对路径

    粗浅理解: 1)绝对路径:带有访问协议的路径,就是带上http访问协议 2)相对路径: ①以带斜杠开头的相对路径: A)前台相对路径:以web服务器的根路径为参照路径,比如在jsp.HTML中写的路径 ...

  5. maven快速上手

    1.maven安装 首先下载apache-maven-3.3.3-bin.zip(版本可以自己根据自己想要的下载). 解压后如下:   接下来配置系统环境变量: 到此,maven安装好了,接下来输入 ...

  6. Web项目、Http协议简介

    Web 静态web项目 静态web项目就是一个文件夹.静态Web项目 就是文件夹中都是静态资源. 如何将web项目部署到tomcat? 将web项目的文件夹复制到webapps目录下.比如把test文 ...

  7. 37. leetcode 108. Convert Sorted Array to Binary Search Tree

    108. Convert Sorted Array to Binary Search Tree 思路:利用一个有序数组构建一个平衡二叉排序树.直接递归构建,取中间的元素为根节点,然后分别构建左子树和右 ...

  8. 认真地搞OI

    新博客的开头 OI生涯的开始 #include<cstdio> int main() { puts("Hello world!"); ; }

  9. Open-Falcon第七步安装报警模块(小米开源互联网企业级监控系统)

    sender调用各个公司提供的mail-provider和sms-provider,按照某个并发度,从redis中读取邮件.短信并发送,alarm生成的报警短信和报警邮件都是直接写入redis即可,s ...

  10. 【待整理】MySQL alter table modify vs alter table add产生state不一样

    MySQL:5.6.35 OS:redhat5.8 今天更新数据库某些表字段,有如下两SQL: ①alter table xx modify xxxx;(表大概是77w) ②alter table s ...