时间技巧:包括验证码有效时间的建立,两个时间差(给出了一个时间到零点的思路),使用 after(); before(); 或 compareTo(); 比较时间先后,实时获取时间(不建议,页面获取更佳)
希望对你有帮助,祝你有一个好心情,加油!
若有错误、不全、可优化的点,欢迎纠正与补充;转载请注明出处!
import java.awt.BorderLayout;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class test {
public static void main(String[] args) throws ParseException{
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date startTime = dateFormat.parse("2016-09-01 11:30:00");
Date endTime = dateFormat.parse("2016-09-02 13:33:30");
timeDemo01();//某个时间前后30分钟
timeDemo02(startTime, endTime);//两个时间的差/现在时间到今天零点的差
timeDemo03(dateFormat, startTime, endTime);//判断两个时间的先后/日期是否在有效期内
TimeDemo04 frame = new TimeDemo04();//获取动态时间,建议页面获取,Java写太费事
}
/**
* 获取现在时间前后n分钟的时刻:例这个验证有效时间为30分钟
* @throws ParseException
*/
public static void timeDemo01() throws ParseException{
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
//方法一:获取现在时间30分钟后的时间
System.out.println("现在本地时间: " + dateFormat.format(new Date()));//11:33:09//一种获得方法,能省
Calendar calendar = Calendar.getInstance();
System.out.println("现在本地时间: " + dateFormat.format(calendar.getTime()));//11:33:09
calendar.add(Calendar.MINUTE,30);
System.out.println("现在本地时间 + 30分钟: " + dateFormat.format(calendar.getTime()));//11:33:09
//方法二:获取现在时间30分钟前后的时间,不建议,好学习理解
/*String overDate = "00:30:00";
long time01 = Long.valueOf(dateFormat.parse(overDate).getTime());
System.out.println("30分钟long表示为: " + time01);//-27000000
System.out.println("30分钟表示为: " + new Date(time01));//Thu Jan 01 00:30:00 CST 1970
System.out.println("查看本地时差(加30分钟):" + new Date(1000*60*30));//Thu Jan 01 08:30:00 CST 1970
long time = Long.valueOf(dateFormat.parse(overDate).getTime())+(8*60*60*1000);//时差
System.out.println("以本地时间定位,30分钟long表示为: " + time);//1800000
System.out.println("以本地时间定位,30分钟表示为: " + new Date(time));//Thu Jan 01 08:30:00 CST 1970
System.out.println("本地时间定位: " + new Date(System.currentTimeMillis()));//Sat Sep 03 10:57:16 CST 2016
System.out.println("以本地时间定位,30分钟前时间: " + new Date(System.currentTimeMillis()-time));//Sat Sep 03 10:27:16 CST 2016
System.out.println("以本地时间定位,30分钟后时间: " + new Date(System.currentTimeMillis()+time));//Sat Sep 03 11:27:16 CST 2016
*/
}
/**
* 获取两个时间的差:不是最好,但适合大部分情况,易变通
* 获得现在时间到今天零点的差:
* 获得现在时间
* 获得零点时间就是今天时间的 /24*60*60*1000 再乘一次
* 相减就好
* long time01 = ( Long.valueOf(System.currentTimeMillis()) / (24*60*60*1000)) * 24*60*60*1000;
System.out.println( new Date(time01));//当天零点(有时差)看timeDemo01里的方法二
System.out.println( new Date());//现在时间
* @throws ParseException
*/
public static void timeDemo02(Date startTime, Date endTime) throws ParseException{
long targetTime = (endTime.getTime()-startTime.getTime())/1000;//转换秒为单位
long day = targetTime / ( 24 * 3600 );
long hour= targetTime % ( 24 * 3600 ) / 3600;
long minute = targetTime % 3600 / 60;
long second = targetTime % 60 / 60;
System.out.println("需要获得的目标时间为:" + day + "天" + hour + "小时" + minute + "分" + second + "秒" );
}
/**
* 判断时间 travelDate 是否在有效期内
* @param dateFormat 传入的日期格式
* @param startDate 有效开始日期
* @param endDate 有效截止日期
* @throws ParseException
*/
public static void timeDemo03(SimpleDateFormat dateFormat, Date startDate, Date endDate) throws ParseException{
Date travelDate = dateFormat.parse("2016-09-02 13:33:00");
//包括等于的情况,after()与before()不包括等于
if(travelDate.compareTo(startDate) >= 0 && travelDate.compareTo(endDate) <= 0){
//if(travelDate.after(startDate) && travelDate.before(endDate)){
System.out.println("时间 travelDate: " + travelDate + "在 startDate: " + startDate + "与" + " endDate: " + endDate + "内,在要求时间内。");
}
}
}
class TimeDemo04 extends JFrame{
JTextField jTextField01 ;
public TimeDemo04(){
this.setTitle("Test");
this.setSize(500, 500);
JPanel jpanel = new JPanel();
jpanel.setLayout(new BorderLayout());
JTextField jTextField02 = new JTextField();
jTextField01 = new JTextField(" yyyy-MM-dd HH:mm:ss ");
jTextField02.setBorder(BorderFactory.createLoweredBevelBorder());
jTextField01.setBorder(BorderFactory.createLoweredBevelBorder());
jTextField01.setHorizontalAlignment(JTextField.RIGHT);
jTextField02.setEditable(false);
jTextField01.setEditable(false);
jpanel.add(jTextField02);
jpanel.add(jTextField01,BorderLayout.EAST);
jpanel.setBorder(BorderFactory.createEtchedBorder());
this.add(jpanel,BorderLayout.SOUTH);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Timer t = new Timer();
t.schedule(new TimeDemo05(), 1000,1000);
}
class TimeDemo05 extends TimerTask{
@Override
public void run() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dynamicTime = dateFormat.format(new Date());
jTextField01.setText(dynamicTime);
}
}
}
备注:增加一个时间格式的描述
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
* 工作中遇到时间转换格式问题:时间转换为美英格式
* @author ChengFengXiaoZhan
*/
public class TimeTest {
public static void main(String[] args) {
/*
* 英文日期分英式和美式,如下:
* 1) 8th March,2009 或8 March,2009(英式)
* 2) March 8th,2009 或March 8,2009 (美式)
* 日期写法宜遵从下列规则:
* 1)年份必须完全写明,不可用"09代替2009;
* 2)月份必须用英文拼出或采用公认的简写,即 January (Jan.),February (Feb.),March(Mar.),April(Apr.),May,June,July,August (Aug.),September (Sept.),October(Oct.),November(Nov.),December(Dec.);
* 3)日期可用序数词,如:1st,2nd,3rd,4th,...;也可用基数词,如:1,2,3,4,...。但美式大多采用后者;
* 4)在年份和月日之间必须用逗号隔开;
* 5)日期不可全部采用如7.12.2003或7/12/2003的阿拉伯数字书写,否则会引起误解。因为英美在这方面的习惯用法不同。按美国人习惯,上述日期为2003年7月12日,而按英国习惯则是2003年12月7日。
* 注:英文日期分英式和美式,请自行选择格式
*/
Date date = new Date();
DateFormat df1 = new SimpleDateFormat("MMM-dd'th', yyyy",Locale.ENGLISH);
SimpleDateFormat sdf1 = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z", Locale.UK);
SimpleDateFormat sdf2 = new SimpleDateFormat("dd MMM,yyyy", Locale.UK);
SimpleDateFormat sdf3 = new SimpleDateFormat("dd'th' MMM,yyyy", Locale.UK);
System.out.println(df1.format(date));
System.out.println(sdf1.format(date));
System.out.println(sdf2.format(date));
System.out.println(sdf3.format(date));
}
}
import java.awt.BorderLayout;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class test {
public static void main(String[] args) throws ParseException{
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date startTime = dateFormat.parse("2016-09-01 11:30:00");
Date endTime = dateFormat.parse("2016-09-02 13:33:30");
timeDemo01();//某个时间前后30分钟
timeDemo02(startTime, endTime);//两个时间的差/现在时间到今天零点的差
timeDemo03(dateFormat, startTime, endTime);//判断两个时间的先后/日期是否在有效期内
TimeDemo04 frame = new TimeDemo04();//获取动态时间,建议页面获取,Java写太费事
}
/**
* 获取现在时间前后n分钟的时刻:例这个验证有效时间为30分钟
* @throws ParseException
*/
public static void timeDemo01() throws ParseException{
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
//方法一:获取现在时间30分钟后的时间
System.out.println("现在本地时间: " + dateFormat.format(new Date()));//11:33:09//一种获得方法,能省
Calendar calendar = Calendar.getInstance();
System.out.println("现在本地时间: " + dateFormat.format(calendar.getTime()));//11:33:09
calendar.add(Calendar.MINUTE,30);
System.out.println("现在本地时间 + 30分钟: " + dateFormat.format(calendar.getTime()));//11:33:09
//方法二:获取现在时间30分钟前后的时间,不建议,好学习理解
/*String overDate = "00:30:00";
long time01 = Long.valueOf(dateFormat.parse(overDate).getTime());
System.out.println("30分钟long表示为: " + time01);//-27000000
System.out.println("30分钟表示为: " + new Date(time01));//Thu Jan 01 00:30:00 CST 1970
System.out.println("查看本地时差(加30分钟):" + new Date(1000*60*30));//Thu Jan 01 08:30:00 CST 1970
long time = Long.valueOf(dateFormat.parse(overDate).getTime())+(8*60*60*1000);//时差
System.out.println("以本地时间定位,30分钟long表示为: " + time);//1800000
System.out.println("以本地时间定位,30分钟表示为: " + new Date(time));//Thu Jan 01 08:30:00 CST 1970
System.out.println("本地时间定位: " + new Date(System.currentTimeMillis()));//Sat Sep 03 10:57:16 CST 2016
System.out.println("以本地时间定位,30分钟前时间: " + new Date(System.currentTimeMillis()-time));//Sat Sep 03 10:27:16 CST 2016
System.out.println("以本地时间定位,30分钟后时间: " + new Date(System.currentTimeMillis()+time));//Sat Sep 03 11:27:16 CST 2016
*/
}
/**
* 获取两个时间的差:不是最好,但适合大部分情况,易变通
* 获得现在时间到今天零点的差:
* 获得现在时间
* 获得零点时间就是今天时间的 /24*60*60*1000 再乘一次
* 相减就好
* long time01 = ( Long.valueOf(System.currentTimeMillis()) / (24*60*60*1000)) * 24*60*60*1000;
System.out.println( new Date(time01));//当天零点(有时差)看timeDemo01里的方法二
System.out.println( new Date());//现在时间
* @throws ParseException
*/
public static void timeDemo02(Date startTime, Date endTime) throws ParseException{
long targetTime = (endTime.getTime()-startTime.getTime())/1000;//转换秒为单位
long day = targetTime / ( 24 * 3600 );
long hour= targetTime % ( 24 * 3600 ) / 3600;
long minute = targetTime % 3600 / 60;
long second = targetTime % 60 / 60;
System.out.println("需要获得的目标时间为:" + day + "天" + hour + "小时" + minute + "分" + second + "秒" );
}
/**
* 判断时间 travelDate 是否在有效期内
* @param dateFormat 传入的日期格式
* @param startDate 有效开始日期
* @param endDate 有效截止日期
* @throws ParseException
*/
public static void timeDemo03(SimpleDateFormat dateFormat, Date startDate, Date endDate) throws ParseException{
Date travelDate = dateFormat.parse("2016-09-02 13:33:00");
//包括等于的情况,after()与before()不包括等于
if(travelDate.compareTo(startDate) >= 0 && travelDate.compareTo(endDate) <= 0){
//if(travelDate.after(startDate) && travelDate.before(endDate)){
System.out.println("时间 travelDate: " + travelDate + "在 startDate: " + startDate + "与" + " endDate: " + endDate + "内,在要求时间内。");
}
}
}
class TimeDemo04 extends JFrame{
JTextField jTextField01 ;
public TimeDemo04(){
this.setTitle("Test");
this.setSize(500, 500);
JPanel jpanel = new JPanel();
jpanel.setLayout(new BorderLayout());
JTextField jTextField02 = new JTextField();
jTextField01 = new JTextField(" yyyy-MM-dd HH:mm:ss ");
jTextField02.setBorder(BorderFactory.createLoweredBevelBorder());
jTextField01.setBorder(BorderFactory.createLoweredBevelBorder());
jTextField01.setHorizontalAlignment(JTextField.RIGHT);
jTextField02.setEditable(false);
jTextField01.setEditable(false);
jpanel.add(jTextField02);
jpanel.add(jTextField01,BorderLayout.EAST);
jpanel.setBorder(BorderFactory.createEtchedBorder());
this.add(jpanel,BorderLayout.SOUTH);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Timer t = new Timer();
t.schedule(new TimeDemo05(), 1000,1000);
}
class TimeDemo05 extends TimerTask{
@Override
public void run() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dynamicTime = dateFormat.format(new Date());
jTextField01.setText(dynamicTime);
}
}
}
备注:增加一个时间格式的描述
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
* 工作中遇到时间转换格式问题:时间转换为美英格式
* @author ChengFengXiaoZhan
*/
public class TimeTest {
public static void main(String[] args) {
/*
* 英文日期分英式和美式,如下:
* 1) 8th March,2009 或8 March,2009(英式)
* 2) March 8th,2009 或March 8,2009 (美式)
* 日期写法宜遵从下列规则:
* 1)年份必须完全写明,不可用"09代替2009;
* 2)月份必须用英文拼出或采用公认的简写,即 January (Jan.),February (Feb.),March(Mar.),April(Apr.),May,June,July,August (Aug.),September (Sept.),October(Oct.),November(Nov.),December(Dec.);
* 3)日期可用序数词,如:1st,2nd,3rd,4th,...;也可用基数词,如:1,2,3,4,...。但美式大多采用后者;
* 4)在年份和月日之间必须用逗号隔开;
* 5)日期不可全部采用如7.12.2003或7/12/2003的阿拉伯数字书写,否则会引起误解。因为英美在这方面的习惯用法不同。按美国人习惯,上述日期为2003年7月12日,而按英国习惯则是2003年12月7日。
* 注:英文日期分英式和美式,请自行选择格式
*/
Date date = new Date();
DateFormat df1 = new SimpleDateFormat("MMM-dd'th', yyyy",Locale.ENGLISH);
SimpleDateFormat sdf1 = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z", Locale.UK);
SimpleDateFormat sdf2 = new SimpleDateFormat("dd MMM,yyyy", Locale.UK);
SimpleDateFormat sdf3 = new SimpleDateFormat("dd'th' MMM,yyyy", Locale.UK);
System.out.println(df1.format(date));
System.out.println(sdf1.format(date));
System.out.println(sdf2.format(date));
System.out.println(sdf3.format(date));
}
}