关于JAVA中日期的计算问题

时间:2022-01-03 15:43:27
数据库中存储时间格式为20050101061236 时间为2005-01-01 6:12:36 
如何把字符型转换为日期型的,而且还要加上8个小时 
再加30天 再减去当前时间  得到的一个天数 
我要算一个有效天数
谢谢各位在侠啦~

8 个解决方案

#1


这样处理日期麻烦的。应该把所有的日期转换成相对于1970-01-01的毫秒数存在数据库里。这样计算日期就很方便。

#2


import java.text.DateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;

//作用:提供字符串形式的日期到毫秒的转换,和毫秒到字符串日期以及年、月、日的转换
public class DateMillisConvert {

private static GregorianCalendar calendar = new GregorianCalendar();

public DateMillisConvert() {

}

//提供“yyyy-mm-dd”形式的字符串到毫秒的转换
public static long getMillis(String dateString) {
String[] date = dateString.split("-");
return getMillis(date[0], date[1], date[2]);
}

//根据输入的年、月、日,转换成毫秒表示的时间
public static long getMillis(int year, int month, int day) {
GregorianCalendar calendar = new GregorianCalendar(year, month, day);
return calendar.getTimeInMillis();
}

//根据输入的年、月、日,转换成毫秒表示的时间
public static long getMillis(String yearString, String monthString, String dayString) {
int year = Integer.parseInt(yearString);
int month = Integer.parseInt(monthString);
int day = Integer.parseInt(dayString);
return getMillis(year, month, day);
}

//获得当前时间的毫秒表示
public static long getNow() {
GregorianCalendar now = new GregorianCalendar();
return now.getTimeInMillis();
}

//根据输入的毫秒数,获得日期字符串
public static String getDate(long millis) {
calendar.setTimeInMillis(millis);
return DateFormat.getDateInstance().format(calendar.getTime());
}

//根据输入的毫秒数,获得年份
public static int getYear(long millis) {
calendar.setTimeInMillis(millis);
return calendar.get(Calendar.YEAR);
}

//根据输入的毫秒数,获得月份
public static int getMonth(long millis) {
calendar.setTimeInMillis(millis);
return calendar.get(Calendar.MONTH);
}

//根据输入的毫秒数,获得日期
public static int getDay(long millis) {
calendar.setTimeInMillis(millis);
return calendar.get(Calendar.DATE);
}

//根据输入的毫秒数,获得小时
public static int getHour(long millis) {
calendar.setTimeInMillis(millis);
return calendar.get(Calendar.HOUR_OF_DAY);
}

//根据输入的毫秒数,获得分钟
public static int getMinute(long millis) {
calendar.setTimeInMillis(millis);
return calendar.get(Calendar.MINUTE);
}

//根据输入的毫秒数,获得秒
public static int getSecond(long millis) {
calendar.setTimeInMillis(millis);
return calendar.get(Calendar.SECOND);
}
}

#3


String str = "20050101061236";
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
long time = format.parse(str).getTime() + 1000l*60*60*8 + 1000l*60*60*24*30;

format = new SimpleDateFormat("yyyyMMdd");
Date res = format.parse(format.format(new Date(time)));

#4


如果是时间类型的话,应该在数据库中也定义成时间类型,而不要用字符串形式

#5


以后有用哈~~
标记。

#6


上面的那个类中的calendar对象最好不要做成static的
否则在多线程的时候可能会有问题

要不就把每一个方法设置为synchronized

#7


没办法,数据格式偶也控制不了,自动生成这样的。
GregorianCalendar计算两个日期的天数也要转换成秒吧~~
谢谢 someone_somewhere overcast(http://blog.****.net/overcast) 
overcast 好像SUN不赞成用DATE类啦 还有 1000l*60*60*8  为什么是10001??
好像应该是1秒=1000毫秒吧
不过问题已经解决~~ 谢谢各位朋友~~

#8


那个是1000l 不是 10001
1000是int类型,60和8都是
如果这样相乘的话1000*60*60*24*30应该要溢出了,得到的结果会不对
而1000l表示一个long类型就不会溢出了

另外Date类应该没有@deprecated掉
只是里面的一些方法不推荐使用了,比如getDay之类的

#1


这样处理日期麻烦的。应该把所有的日期转换成相对于1970-01-01的毫秒数存在数据库里。这样计算日期就很方便。

#2


import java.text.DateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;

//作用:提供字符串形式的日期到毫秒的转换,和毫秒到字符串日期以及年、月、日的转换
public class DateMillisConvert {

private static GregorianCalendar calendar = new GregorianCalendar();

public DateMillisConvert() {

}

//提供“yyyy-mm-dd”形式的字符串到毫秒的转换
public static long getMillis(String dateString) {
String[] date = dateString.split("-");
return getMillis(date[0], date[1], date[2]);
}

//根据输入的年、月、日,转换成毫秒表示的时间
public static long getMillis(int year, int month, int day) {
GregorianCalendar calendar = new GregorianCalendar(year, month, day);
return calendar.getTimeInMillis();
}

//根据输入的年、月、日,转换成毫秒表示的时间
public static long getMillis(String yearString, String monthString, String dayString) {
int year = Integer.parseInt(yearString);
int month = Integer.parseInt(monthString);
int day = Integer.parseInt(dayString);
return getMillis(year, month, day);
}

//获得当前时间的毫秒表示
public static long getNow() {
GregorianCalendar now = new GregorianCalendar();
return now.getTimeInMillis();
}

//根据输入的毫秒数,获得日期字符串
public static String getDate(long millis) {
calendar.setTimeInMillis(millis);
return DateFormat.getDateInstance().format(calendar.getTime());
}

//根据输入的毫秒数,获得年份
public static int getYear(long millis) {
calendar.setTimeInMillis(millis);
return calendar.get(Calendar.YEAR);
}

//根据输入的毫秒数,获得月份
public static int getMonth(long millis) {
calendar.setTimeInMillis(millis);
return calendar.get(Calendar.MONTH);
}

//根据输入的毫秒数,获得日期
public static int getDay(long millis) {
calendar.setTimeInMillis(millis);
return calendar.get(Calendar.DATE);
}

//根据输入的毫秒数,获得小时
public static int getHour(long millis) {
calendar.setTimeInMillis(millis);
return calendar.get(Calendar.HOUR_OF_DAY);
}

//根据输入的毫秒数,获得分钟
public static int getMinute(long millis) {
calendar.setTimeInMillis(millis);
return calendar.get(Calendar.MINUTE);
}

//根据输入的毫秒数,获得秒
public static int getSecond(long millis) {
calendar.setTimeInMillis(millis);
return calendar.get(Calendar.SECOND);
}
}

#3


String str = "20050101061236";
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
long time = format.parse(str).getTime() + 1000l*60*60*8 + 1000l*60*60*24*30;

format = new SimpleDateFormat("yyyyMMdd");
Date res = format.parse(format.format(new Date(time)));

#4


如果是时间类型的话,应该在数据库中也定义成时间类型,而不要用字符串形式

#5


以后有用哈~~
标记。

#6


上面的那个类中的calendar对象最好不要做成static的
否则在多线程的时候可能会有问题

要不就把每一个方法设置为synchronized

#7


没办法,数据格式偶也控制不了,自动生成这样的。
GregorianCalendar计算两个日期的天数也要转换成秒吧~~
谢谢 someone_somewhere overcast(http://blog.****.net/overcast) 
overcast 好像SUN不赞成用DATE类啦 还有 1000l*60*60*8  为什么是10001??
好像应该是1秒=1000毫秒吧
不过问题已经解决~~ 谢谢各位朋友~~

#8


那个是1000l 不是 10001
1000是int类型,60和8都是
如果这样相乘的话1000*60*60*24*30应该要溢出了,得到的结果会不对
而1000l表示一个long类型就不会溢出了

另外Date类应该没有@deprecated掉
只是里面的一些方法不推荐使用了,比如getDay之类的