我是Android和Java的新手。
我正在尝试将值为“1986-10-02”的字符串转换为Integer,以便将其保存到数据库中。该日期所需的整数值为528595200。
我已经关注了大量的SO示例,但我无法构建它。任何建议高度赞赏!这是我的代码:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+10"));
Date d = sdf.parse("1986-10-02");
Long DateAsInteger = d.getTime()*1000L;
Integer iDOB = DateAsInteger.intValue();
所需的Integer(528595200)是Unix时间戳。在我的代码的另一部分,当我从数据库中检索该整数并将其转换为日期时,它正常工作并生成一个字符串=“02-10-1986”。
Date date = new Date(cursor.getInt(4)*1000L); // *1000 is to convert seconds to milliseconds
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); // the format of your date
sdf.setTimeZone(TimeZone.getTimeZone("GMT+10"));
String formattedDate = sdf.format(date);
答案 0 :(得分:2)
我想提供现代答案。这不是你要求的答案,但我希望这是你想要的答案。
SimpleDateFormat
和Date
已过时。我可以理解为什么你仍然试图在Android上使用它们,因为Android Java 7没有更好的内置功能。但是,这是您学习使用外部库的好时机。我建议你使用ThreeTenABP,它为你提供了现代的Java日期和时间API,它比过时的类更好用。
关于如何在项目中包含该库,this question: How to use ThreeTenABP in Android Project中有一个很好的解释。
然后代码可以是:
long unixTimestamp = LocalDate.parse("1986-10-02")
.atStartOfDay(ZoneOffset.UTC)
.toInstant()
.getEpochSecond();
int intValue;
if (unixTimestamp <= Integer.MAX_VALUE) {
intValue = (int) unixTimestamp;
System.out.println(intValue);
} else {
System.out.println("int overflow; cannot represent " + unixTimestamp + " in an int");
}
打印:
528595200
这是您要求的价值。似乎没有必要使用您在问题中尝试过的GMT + 10时区(我尝试过,并得到了错误的结果)。
int
Unix时间戳可以用32位int
表示,直到2038年1月的某个时间,之后你会遇到一种“2000年问题”。所以我想我们也可能习惯使用64-bit long
代替。
对于您问题中的代码,您可能会遇到一些问题(除了使用过时的类):
ParseException
的可能性,方法是声明您的方法可能会抛出它,或者使用try
/ catch
构造包围您的代码。阅读Java中的异常处理以了解更多信息,它在很多地方都有描述。1000L
而不是除以它,从而溢出了您尝试将结果存储到Integer
之后。TimeZone.getTimeZone("GMT")
而不是+10
。答案 1 :(得分:1)
试试这个
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+10"));
Date d = sdf.parse("1986-10-02");
Log.e("Int Date : ", d.getTime()/1000+"");// covert date in to int
Log.e("Int Date : ",""+ new Date(((long)d.getTime()/1000)*1000L));/ covert date in to Long
} catch (ParseException e) {
e.printStackTrace();
}
答案 2 :(得分:1)
试试这个家伙:
String sDate="31/12/1998";
Date myDate = new Date();
try {
myDate=new SimpleDateFormat("dd/MM/yyyy").parse(sDate);
} catch (ParseException e) {
e.printStackTrace();
}
Integer res = (int) myDate.getTime();
可能是你的问题是因为试试了
答案 3 :(得分:0)
非常感谢大家的帮助。我按照你的建议使用Long而不是Int,并且还使用了try / catch。我设法让它与下面的工作:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+10"));
try {
Date d = sdf.parse("1986-10-02");
Long DateAsInteger = d.getTime()/1000;
} catch (Exception e) {
// this is where you handle it if an error occurs
}