在我的应用程序中,我希望获得当前日期和月份当地小时(currentTimeZone小时),并根据其值显示一些内容。
我已阅读了几个解决方案,并使用了以下内容:
Calendar c = Calendar.getInstance();
int day=c.get(Calendar.DATE);
int month=c.get(Calendar.MONTH);
或者
Time today = new Time(Time.getCurrentTimezone());
today.setToNow();
int day2=today.monthDay;
int month2=today.month;
我的问题是:
1)考虑到他们的结果,哪一个更“稳定”?我的意思是它没有任何问题。
2)此外,他们是否都考虑了TimeZone?我认为第二个会这样做,但日历呢?
3)我尝试了这个代码:
SimpleDateFormat s = new SimpleDateFormat("ddMMyyyyhhmmss");
String format = s.format(new Date());
我得到Date()必须有一个参数的错误。很奇怪,因为在每个答案中他们都会这样使用它。
有什么问题?
4)你建议我用什么?我唯一想要的是在当前月份,日期,小时与一些存储在内存中的简单比较。 (例如,如果是1月29日,则显示该事件。如果是19.00 am发送通知,依此类推。)
答案 0 :(得分:14)
1)考虑到他们的结果,哪一个更“稳定”?我的意思是 它不会有任何问题。
它们都是稳定且经过良好测试的,尤其是自JDK1.1以来在Java API中的Calendar
。同样来自Time
的{{3}}:
Calendar和GregorianCalendar类的替代方法。一个 Time类的实例表示一个时刻,用。指定 第二精度。它以struct tm为模型,实际上是使用的 struct tm实现大部分功能。
Time
,imho,比Calendar
更容易工作。
2)此外,他们是否都考虑了TimeZone?一世 认为第二个确实如此,但日历呢?
是的,他们这样做。您可以使用docs指定TimeZone
。否则,将使用默认值。
3)我尝试了这个代码:
代码工作得很好。例如,请确保使用new java.util.Date()
代替java.sql.Date
。
4)你建议我用什么?我唯一想要的就是简单 当前月份,日期,小时与一些存储在内存中的比较。 (例如,如果是1月29日,则显示该事件。如果是19.00上午 发送通知等。)
这真的是个人选择的问题。例如,使用Calendar
来比较今天是否是1月29日,您只需使用以下内容:
Calendar today = Calendar.getInstance();
int dayOfMonth = today.get(Calendar.DAY_OF_MONTH);
int month = today.get(Calendar.MONTH);
if (month == Calendar.JANUARY && dayOfMonth == 29) {
// January 29
}
答案 1 :(得分:0)
在我的Android应用中,我在SQLite中保存日期。但是,SQLite不接受Date数据类型。所以我将其转换为String,以便使用格式 YYYY-MM-DD :
Time today = new Time(Time.getCurrentTimezone());
today.setToNow();
int year = today.year;
int month = today.month;
int day = today.monthDay;
Calendar gregorianCalendar = new GregorianCalendar(year, month, day);
String entryDate = gregorianCalendar.get(Calendar.YEAR) + "-" + gregorianCalendar.get(Calendar.MONTH) + "-" + gregorianCalendar.get(Calendar.DAY_OF_MONTH);
效果很好。我不关心性能差异,因为它们可能是疏忽大意。
答案 2 :(得分:0)
android.text.format.Time在API级别22中已弃用。 请改用GregorianCalendar。
访问http://developer.android.com/reference/android/text/format/Time.html
据我所知,Time类中存在一些问题,例如Time.setJulianDay(int julianDay)在参数小于1970.1.1的julianDay时会返回错误的值
1987年至1991年4月也发生了一些错误(也许是Time.set(long millis),我记不清了。)
答案 3 :(得分:0)
ZonedDateTime.now().getDayOfMonth()
正如其他人评论的那样,您似乎正在使用并混淆java.sql.Time
,java.sql.Date
,java.util.Date
和java.util.Calendar
。
这些麻烦的类的所有现在都是遗留的,取而代之的是添加到Java 8及更高版本的java.time类。对于早期的Android,请参阅下面的最后一个项目符号。
要获取特定时区的当前时刻,请使用ZonedDateTime
。
时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。
如果未指定时区,则JVM会隐式应用其当前的默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好明确指定您期望/预期的时区作为参数。
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
在询问当前时刻时通过该区域。
ZonedDateTime zdt = ZonedDateTime.now( z ) ; // Current moment as seen by the people of particular region.
询问你想要的部件。
Month month = zdt.getMonth() ; // Get `Month` enum object.
int monthNumber = zdt.getMonthValue() ; // Get month number, 1-12 for January-December.
int dayOfMonth = zdt.getDayOfMonth() ;
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。