时间vs日期vs日历java

时间:2012-09-08 22:25:31

标签: java android date time calendar

在我的应用程序中,我希望获得当前日期和月份当地小时(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发送通知,依此类推。)

4 个答案:

答案 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)

TL;博士

ZonedDateTime.now().getDayOfMonth()

java.time

正如其他人评论的那样,您似乎正在使用并混淆java.sql.Timejava.sql.Datejava.util.Datejava.util.Calendar

这些麻烦的类的所有现在都是遗留的,取而代之的是添加到Java 8及更高版本的java.time类。对于早期的Android,请参阅下面的最后一个项目符号。

要获取特定时区的当前时刻,请使用ZonedDateTime

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

如果未指定时区,则JVM会隐式应用其当前的默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好明确指定您期望/预期的时区作为参数。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore