如何将GregorianCalendar转换为Python的Jython日期时间?

问题描述 投票:1回答:1

我在用Jython编程,我想把java.util.GregorianCalendar的日期时间实例转换为Jython的日期时间值。

我已经试过了,但得到以下错误信息:java.util.GregorianCalendar的日期时间实例是一个Jython的日期时间值。

from java.util import Calendar, GregorianCalendar
import datetime

x = GregorianCalendar.getInstance()

y = datetime(x.YEAR, x.MONTH, x.DAY_OF_MONTH, x.HOUR_OF_DAY, x.MINUTE, x.SECOND, x.MILLISECOND)

但我得到了以下错误

TypeError: 'module' object is not callable

然后我运行了这个,我很惊讶地看到错误的值被写入了日志。例如,年份应该是2020年,但在日志中却写成了 "1"。

from java.util import Calendar, GregorianCalendar
import datetime


x = GregorianCalendar.getInstance()

print x
print "Year", x.YEAR
print "Month",x.MONTH
print "Day", x.DAY_OF_MONTH
print "Hour", x.HOUR_OF_DAY
print "Minute", x.MINUTE
print "Second", x.SECOND
print "Millisecond", x.MILLISECOND
print x.getTime()

日志。

java.util.GregorianCalendar[time=1591195394508,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Berlin",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=143,lastRule=java.util.SimpleTimeZone[id=Europe/Berlin,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2020,MONTH=5,WEEK_OF_YEAR=23,WEEK_OF_MONTH=1,DAY_OF_MONTH=3,DAY_OF_YEAR=155,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=43,SECOND=14,MILLISECOND=508,ZONE_OFFSET=3600000,DST_OFFSET=3600000]
Year 1
Month 2
Day 5
Hour 11
Minute 12
Second 13
Millisecond 14
Wed Jun 03 16:43:14 CEST 2020

谁能告诉我我做错了什么?

java python date jython gregorian-calendar
1个回答
1
投票

java.time.ZonedDateTime 替换了 GregorianCalendar

顺便说一下,你使用的是糟糕的日期-时间类(GregorianCalendar),现在已经成为遗留问题,多年前就被现代社会的 "大国重器 "所取代。java.time JSR 310中定义的类。

使用添加到旧类中的新方法进行转换。ZonedDateTime 替换 GregorianCalendar.

ZonedDateTime zdt = myGregCal.toZonedDateTime() ;

继续提取零件。

不需要在月份中增加一个,因为...。java.time 使用合理的月份编号,1-12为1-12月。只使用 java.time,从来没有 GregorianCalendar.

用Java语法(我不懂Jython)。

int year = zdt.getYear() ; 
int month = zdt.getMonthValue() ;
int day = zdt.getDayOfMonth() ;
int hour = zdt.getHour() ;
int minute = zdt.getMinute() ;
int second = zdt.getSecond() ;
long micro = TimeUnit.NANOSECONDS.toMicros( zdt.getNano() ) ;  // Convert from the nanosecond resolution of java.time to the microsecond resolution of Jython datetime.
String timeZoneId = zdt.getZone().getId() ;

问题中的代码有两个问题:

  • 你用的是毫秒,但在构造函数中... datetime 需要微秒。这里我们将纳秒换算为 java.time 到Jython中使用的微秒。datetime.
  • 你忽略了将时区传递给构造函数的 datetime. 这里我们提取时区的ID,一个格式为 Continent/Region 诸如 Europe/ParisPacific/Auckland.

顺便说一下,遗产 DateGregorianCalendar 类的分辨率为毫秒。Jython的 datetime 类型解析为微秒。的 java.time 类型使用纳秒的分辨率。


Table of all date-time types in Java, both modern and legacy


关于 java.time

java.time 框架内置于Java 8及以后的版本中。这些类取代了麻烦的旧的 遗产 日期-时间类,如 java.util.Date, Calendar,& SimpleDateFormat.

要了解更多信息,请参阅 甲骨文教程. 并在Stack Overflow中搜索许多例子和解释。规格是 JSR 310.

卓达科技-时间 项目,目前正在 维护模式建议移居美国 java.time 课堂。

您可以交换 java.time 对象直接与您的数据库连接。使用 JDBC驱动程序 符合 JDBC 4.2 或更高版本。不需要字符串,不需要 java.sql.* 类,支持Hibernate 5 & JPA 2.2 支持Hibernate 5 & JPA 2.2。java.time.

在哪里获取java.time类?


0
投票

这样就可以了:

from java.util import Calendar, GregorianCalendar
import datetime


x = GregorianCalendar.getInstance()

print x
print "Year", x.get(Calendar.YEAR)
print "Month",x.get(Calendar.MONTH)
print "Day", x.get(Calendar.DAY_OF_MONTH)
print "Hour", x.get(Calendar.HOUR_OF_DAY)
print "Minute", x.get(Calendar.MINUTE)
print "Second", x.get(Calendar.SECOND)
print "Millisecond", x.get(Calendar.MILLISECOND)

y = datetime.datetime(x.get(Calendar.YEAR), x.get(Calendar.MONTH)+1,x.get(Calendar.DAY_OF_MONTH), x.get(Calendar.HOUR_OF_DAY), x.get(Calendar.MINUTE), x.get(Calendar.SECOND), x.get(Calendar.MILLISECOND)*1000)

print y
print x.getTime()
© www.soinside.com 2019 - 2024. All rights reserved.