我想知道如何在Java中创建一个表达式,该表达式将日期变量格式化为“1999-12-30 12:34:45”并将其转换为Int持有“19991230”。
这可能是其他人会欣赏的,特别是人们提取和清理数据以加载到数据仓库中。
我的猜测是需要更改日期模式,转换为字符串,截断第一部分(8个字符)并转换为int。
想法?
(更新) 我不好解释这个问题。 生成的int将作为日期维度的键/ Fk id。应该执行类似的操作来创建时间维度的键。 int将减少事实表中消耗的大小,其中将存储这些int键。请参阅相关答案:https://stackoverflow.com/a/8416548/1132571
答案 0 :(得分:2)
使用SimpleDateFormat类很容易做到这一点。但是,正如其他人所提到的,您可能应该将纪元时间戳存储为Database TimeStamp列,而不是将日期存储在int表单中。当您使用SQL操作数据时,它将导致问题。
public static void main(String[] args) throws ParseException {
String dateStr = "1999-12-30 12:34:45";
String formatStr = "yyyy-MM-dd HH:mm:ss";
String formatStrOther = "yyyyMMdd";
Date testDate = null;
SimpleDateFormat sdf= new SimpleDateFormat(formatStr);
SimpleDateFormat sdfOther= new SimpleDateFormat(formatStrOther);
sdf.setLenient(false);
testDate = sdf.parse(dateStr);
Integer otherDate = Integer.valueOf(sdfOther.format(testDate));
System.out.println("Newly formatted date in int is: " + otherDate); //prints Newly formatted date in int is: 19991230
}
答案 1 :(得分:1)
只需删除特殊字符,然后转换为int
Integer.parseInt("1999-12-30 12:34:45".replaceAll("[- :]", ""));
在你的情况下,你只需要日期,而不是时间,所以:
Integer.parseInt("1999-12-30 12:34:45".substring(0,10).replaceAll("-", ""));
我应该提一下,这只有在原始格式正确的情况下才有效...而且它实际上非常难看,我宁愿使用long和getTime - 也许是simpleDateFormat。你真的不想扔掉有用的数据!
答案 2 :(得分:0)
getTime会给你一个很长的信息,int不够大。
http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Date.html#getTime()
答案 3 :(得分:0)
虽然我同意评论者发现这很奇怪,如果我真的需要将日期转换为长日期,我会使用date.getTime()
返回一个代表自1970年1月1日以来的毫秒数的长。< / p>
好处是它可以很容易地变回日期(Java有一个构造函数,我怀疑其他语言也是如此)
答案 4 :(得分:0)
假设格式保持不变:
String dateStr = "1999-12-30 12:34:45";
dateStr = dateStr.substring(0, 10);
dateStr = dateStr.replace("-", "");
int n = Integer.parseInt(dateStr);
System.out.println(n);
版画:19991230
答案 5 :(得分:0)
var dateObj=new Date("1999-12-30 12:34:45");
然后您需要做的就是获取日期对象的值,如下所示:
var timeStamp=dateObj.valueOf();
这将给你自1970年以来的毫秒,这是一个大多数计算机系统使用的通用时间系统。
转换回使用:
var newTime=new Date(timeStamp);
答案 6 :(得分:0)
使用SimpleDateFormat,SimpleDateFormat.parse,SimpleDateFormat.format和Integer.parseInt [http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html]
1)创建一个SimpleDateFormat来将字符串解析为Date对象
2)创建一个SimpleDateFormat,将Date对象格式化为in
的String表示形式3)使用Integer.parseInt将新格式化的String更改为int。
但是,将日期存储为仓库的int对我来说没有多大意义。
我想有一些限制阻止您使用ISO 8601格式的日期或字符串。
答案 7 :(得分:0)
另一个。 (我不喜欢解析字符串,也不喜欢日期。; - ))
DateFormat format = new SimpleDateFormat("dd-MM-yyyy");
Date d;
try {
d = (Date)format.parse("30-12-1999");
Calendar c = Calendar.getInstance();
c.setTime(d);
int result = c.get(Calendar.YEAR) * 100*100 +
(c.get(Calendar.MONTH) + 1) * 100 +
c.get(Calendar.DAY_OF_MONTH);
System.out.println(result);
} catch (ParseException e) {
e.printStackTrace();
}
答案 8 :(得分:0)
感谢所有建议,意见和建议。 这就是我想要的:
Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(row.date));
row.date
(来自Talend Open Studio)保存我想要转换为int日期密钥的日期。
答案 9 :(得分:0)
在很多方面,您最好将日期键保留为日期,尽管您可能希望在关键日期截断日期。如果您还需要实际日期时间,请单独存储。这有很多原因,主要与日期算术有关。
可以在不加入日期维度的情况下计算事实表上的日期范围。
查询将返回日期 - 如果您只是在桌面上进行临时查询,这非常有效。
可以选择“之前”,“之后”,“错误”的特殊值,因此它们仍然相当明显('1800-01-01','9000-01-01''6666-01 -01'等。)。
如果您不必涉及日期维度,则按日期或日期范围进行自我联接会更有效。
最重要的是,日期算术可以直接在表格上完成,而无需加入维度。在'2012-01-15'之前180天计算日期比在20120115执行日期更容易。此外,SQL没有从20120015到相应日期的本机转换,而没有在维度中查找。