我正在尝试转换字符串日期“Sat Jan 25 00:13:31 +0000 2014” 使用unix_timestamp()HiveQL函数到Unix时间戳。
Hive中的将给定模式的时间字符串转换为Unix时间戳(以秒为单位), 如果失败则返回0:unix_timestamp('2009-03-20','yyyy-MM-dd')= 1237532400
Java Doc http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html#month
unix_timestamp(“Jan-2014”,“MMM-yyyy”)返回NULL
该函数似乎仅适用于以整数表示的月份(即MM)。 溶液
答案 0 :(得分:0)
看起来令人难以置信,但除了1月(1月)以外的其他几个月它都有效......
unix_timestamp('Feb 1 18:41:57 +0000 2014','MMM dd HH:mm:ss Z yyyy')
==> 1391280117
星期几的EEE模式不起作用......
答案 1 :(得分:0)
解决了,问题是我的linux系统的本地化。
答案 2 :(得分:0)
在Java端,使用java.time类进行解析。 YearMonth
类代表一年零一个月。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MMM-yyyy" );
YearMonth ym = YearMonth.parse( "Jan-2014" , f );
我们可以从那个月的第一天获得LocalDate
。
LocalDate today = ym.atDay( 1 );
如果您想要Hive的仅限日期值,则需要以标准SQL格式提供字符串。对于仅日期值,SQL格式与ISO 8601格式一致。在解析或生成字符串时,java.time类默认使用标准的ISO 8601格式。
String output = today.toString(); // YYYY-MM-DD format per ISO 8601 standard.
从那里你显然想要一个日期时间值。我们可以任意分配当天的第一时刻。日期和确定第一时刻的含义取决于时区。在任何特定时刻,日期和时间在全球各个时区都有所不同。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = today.atStartOfDay( z );
从那以后,您可以生成从1970年开始的UTC时代(1970-01-01T00:00:00Z
)以来的整个秒数,以便提供给Hive。
long secondsSinceEpoch = zdt.toEpochSecond();
1388534400
走另一个方向,你需要通过Instant
课程。 Instant
类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位数字)。
Instant instant = Instant.ofEpochSecond( 1_388_534_400L );
如果要查看某个地区的wall-clock time,请应用时区。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date
,.Calendar
和& java.text.SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。
大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。