java时间,日期,毫秒值,String的相互转换总结

java时间日期的各种转换总结以及应用实例

由于工作中经常要用到时间,日期,以及当前时间的毫秒值等

很多时候涉及到了它们之间的相互转换,今天就好好的总结一下.

首先基本介绍一下java中有关时间,日期的类

1. Date类

里面的很多方法已经过时被Calendar或者DateFormat类取代

两种常用的构造方法实例:(其余的已经过时)


Date date = new Date();
// 这种构造方法传递的参数是1970年1月1日到传递时间所经历的毫秒数
Date date2 = new Date(System.currentTimeMillis());
输出的结果如下:
Sat Mar 17 10:13:23 CST 2018
Sat Mar 17 10:13:23 CST 2018

2. Calendar类

常用的初始化方法:

Calendar calendar = Calendar.getInstance();
// 返回的结果:
java.util.GregorianCalendar[time=1521253372638,areFieldsSet=true,areAllFieldsSet=true,
lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",
offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],
firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2018,MONTH=2,WEEK_OF_YEAR=11,
WEEK_OF_MONTH=3,DAY_OF_MONTH=17,DAY_OF_YEAR=76,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=3,
AM_PM=0,HOUR=10,HOUR_OF_DAY=10,MINUTE=22,SECOND=52,MILLISECOND=638,
ZONE_OFFSET=28800000,DST_OFFSET=0]

// 从结果中可以看到,相比于Date类,Calendar类包含了更多的信息
// 除了年月日,时分秒等基本信息还包括当前时间的毫秒值,所在时区等各种信息

3. DateFormat类

初始化方法:

SimpleDateFormat sdf =new SimpleDateFormat("yyyyMMddHHmmssS");

这里简单介绍日期类型常用的format格式:

1.yyyy指的是年(类似于2018), yy指的是年的后两位(类似于18)
2.大写的MM指的是月份,小写的mm指的是分钟
3.dd指的是天
4.大写的HH表示的是24小时制,hh表示的是12小时制
5.ss指的是秒,ssS指的是精确到毫秒
6.为了看起来更容易辨认,可以在format格式部分使用诸如:之类的符号进行分隔
返回结果:
java.text.SimpleDateFormat@bcd152f3
// 返回的结果是这个类的名字 + 这个类的hash码,因为没有重写toString()方法.
// 即getClass().getName() + "@" + Integer.toHexString(hashCode()) 

对三种时间日期常用类就介绍到这里,
下面主要通过实际应用来了解这几种类之间的相互转换

首先介绍当前时间毫秒值的获取方式

Long l = System.currentTimeMillis();
Long time = new Date().getTime();
Long millis = Calendar.getInstance().getTimeInMillis();

接下来就是各种的转换过程:

1. Date类型转变成对应时间的毫秒值

Date date = new Date();
SimpleDateFormat sdf =new SimpleDateFormat("yyMMddHHmm");
try {
	Date d = sdf.parse("1803170000");
	System.out.println(d.getTime());
	} catch (ParseException e) {
		e.printStackTrace();
	}

2.Calendar类型转变成对应时间的毫秒值

Calendar calendar = Calendar.getInstance();
//这里需要注意一下,calendar传入的月份,是从0开始计数的(也就是说,2月相当于实际的三月)
calendar.set(2018, 2, 17); 
System.out.println(calendar.getTimeInMillis());

接下来介绍Date类型如何转变成指定format格式的日期类型

首先回忆一下,Date类型本来是长这个样子的:

Sat Mar 17 13:24:30 CST 2018

1.Date类型转变成年月日时分秒的format格式

Date date = new Date();
SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(date));

转换过后的结果是这样的:

2018-03-17 13:28:41

从结果上看,还是挺美观的吧~


可能我们平时还会有这样的需求,要将普通的Date格式转换成精确到秒的格式:
类似于这样的20180317133112
表达的含义是2018年3月17日13时31分12秒
这种情况该如何做呢?

Date date = new Date();
SimpleDateFormat sdf =new SimpleDateFormat("yyyyMMddHHmmss");
System.out.println(sdf.format(date));

稍微调整一下format格式就可以做到啦!

Date类型和Calendar类型之间的相互转换

1.Date类型转换为Calendar类型

Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());    

2.Calendar类型转换为Date类型

Calendar calendar = Calendar.getInstance();
calendar.getTime();

接下来介绍指定的String format格式转变为Date,Calendar类型

1.String转换为Date类型

String str="2018-3-17";
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
try {
	Date birthday = sdf.parse(str);
	System.out.println(birthday);
    } catch (ParseException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
	}

执行完毕的结果是这样的:

Sat Mar 17 00:00:00 CST 2018

2.String转换为Calendar类型

String str="2018-3-17";	
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
	date = sdf.parse(str);
	} catch (ParseException e) {
	e.printStackTrace();
	}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
System.out.println(calendar);

几个小的案例

工作中遇到的几个小需求

1. 根据毫秒值来获取当前的日期

	/**
     * 根据时间的毫秒值来获取当天的日期 日期格式 :yyyy-MM-dd
     * @param timeMillies(时间的毫秒值)
     * @return
     */
    public static String getStringDate(Long timeMillies)
    {
    	Date date = new Date();
    	date.setTime(timeMillies);
    	SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
    	return sdf.format(date);
    }

2. 将毫秒格式的字符串转变成当前的秒数(也就是降低精度)

	 /**
	     * 将字符串格式的时间转为秒的值
	     *
	     * @param dateTime
	     *            字符串时间(格式:2018-08-29 23:59:46.08)
	     * @return
	     */
	    public static Long getLongFromString(String dateTime) {
	          try {
	        	  /**
	               * 将字符串数据转化为秒数
	               */
	        	  SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//24小时制
	        	  if (dateTime == null || dateTime.equals(""))
	        	  {
	        		  return null;
	        	  }
	      		  return simpleDateFormat.parse(dateTime).getTime();
	         } catch (Exception e ) 
	          {
	        	 return null;
	         }
做一个测试 : 
	g l =getLongFromString("2018-08-30 00:00:03.500");
    	Long l2 = getLongFromString("2018-08-30 00:01:03.600");
    	System.out.println(l2 - l );
这两个时间戳正常的结果应该是 相差: 60100毫秒
但是现在计算输出的结果变成了 相差 : 60000毫秒
已经实现了该需求 ! 

3. 将给定的日期格式变成我们想要的日期格式

	  /**
	     * 将传入的字符串日期 标准化输出
	     * 传入参数 : 20180830  结果 : 2018-08-30
	     * @param str
	     * @return
	     */
	    public static String getFormatDate(String str)
	    {
	    	SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); //传入参数的format格式
	    	SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); //输出结果的format格式
	    	try 
	    	{
				Date date = sdf.parse(str.trim());
				return dateFormat.format(date);
			} catch (ParseException e) 
	    	{
				return "";
			}
	    }

如上:就是我能想到的一些互相转换的方式了,
以后如果在工作中在应用到新的在持续进行更新,
希望能对大家有所帮助!

你可能感兴趣的:(java)