从日历java中生成月份字符到变量中

Posted

技术标签:

【中文标题】从日历java中生成月份字符到变量中【英文标题】:Generate month in character from calendar java into a variable 【发布时间】:2014-01-13 09:59:42 【问题描述】:

大家好,

我尝试使用 Calendar java 创建一个日期变量,以下是我的示例代码:

long day = System.currentTimeMillis();
Calendar cal = Calendar.getInstance();
java.text.SimpleDateFormat month = new java.text.SimpleDateFormat("MMM"); // not sure how to assign this value inside
cal.setTimeInMillis(day);
cal.set(Calendar.HOUR_OF_DAY, 00);
cal.set(Calendar.MINUTE, 00);
cal.set(Calendar.SECOND, 00);
cal.set(Calendar.MILLISECOND, 000);
Date todayDate = cal.getTime();

Timestamp current = new Timestamp(todayDate.getTime());

但是,我得到的current 的值是2014-01-13 00:00:00.0。我更喜欢将01 设置为Jan

对此有何想法?

【问题讨论】:

你想要一个像 01 currentMonth 这样的日期吗? 我更喜欢它变成2014-Jan-13 00:00:00.0而不是2014-01-13 00:00:00.0 仅供参考,麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代.见Tutorial by Oracle。 【参考方案1】:

你的意思是这样的?

        long day = System.currentTimeMillis();
        Calendar cal = Calendar.getInstance();
        java.text.SimpleDateFormat month = new java.text.SimpleDateFormat("yyyy-MMM-dd HH:mm:ss:S"); // not sure how to assign this value inside
        cal.setTimeInMillis(day);
        cal.set(Calendar.HOUR_OF_DAY, 00);
        cal.set(Calendar.MINUTE, 00);
        cal.set(Calendar.SECOND, 00);
        cal.set(Calendar.MILLISECOND, 000);
        Date todayDate = cal.getTime();

        Timestamp current = new Timestamp(todayDate.getTime());
        System.out.println(month.format(current));

产量:

2014-1-13 00:00:00:0

请查看SimpleDateFormat 了解更多格式选项。

【讨论】:

仅供参考,麻烦的旧日期时间类,例如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代.见Tutorial by Oracle。【参考方案2】:

你可以试试这个

    long day = System.currentTimeMillis();
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat month = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss:S");
    cal.setTimeInMillis(day);     
    cal.set(Calendar.HOUR_OF_DAY, 00);
    cal.set(Calendar.MINUTE, 00);
    cal.set(Calendar.SECOND, 00);
    cal.set(Calendar.MILLISECOND, 000);
    Date todayDate = cal.getTime();

    Timestamp current = new Timestamp(todayDate.getTime());
    System.out.println(month.format(current));

现在输出:

    2014-Jan-13 00:00:00:0

ideone

【讨论】:

不要忘记末尾的:S 包含毫秒,这对OP 来说似乎很重要。 @npinti 感谢您指出我,我错过了。添加到答案【参考方案3】:

//不知道这个值怎么在里面赋值

你去吧.. ;)

yy = year (2 digit)
yyyy = year (4 digit)
M = month of the year
MM = month of the year (leading 0)
MMM = month of the year (short text)
MMMM = month of the year (full text)
d = day of the month
dd = day of the month (leading 0)
h = hour (1-12)
H = hour (0-23)
m = minute of the hour
s = second of the minute
S = milisecond
E = day of the week (short)
EEEE = day of the week (full)
D = day of the Year

SimpleDateFormat 类的附加 link

【讨论】:

【参考方案4】:

由于您正在寻找当前日期,因此您不需要currentTimeMillis()

相反,您可以执行以下操作以获得所需的输出。

Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss.S");
System.out.println(sdf.format(cal.getTime()));

【讨论】:

【参考方案5】:

tl;博士

避免麻烦的旧日期时间类。仅使用 java.time 类。

LocalDate.now()                  // Determine the current date as seen in the wall-clock time in use by JVM’s current default time zone. Better to specify explicitly your desired/expected time zone.
         .getMonth()             // Get the `Month` enum object representing the month of that `LocalDate` object’s date value.
         .getDisplayName(        // Let the `Month` enum object automatically localize to generate the string of the name of the month.
             TextStyle.SHORT ,   // Specify how long or abbreviate you want the text of the name of the month.
             Locale.US           // Specify a `Locale` to determine the human language and cultural norms to be used in localizing the name of the month.
         )                       // Return a String.

一月

java.time

现代方法使用 java.time 类。

获取当前月份意味着确定当前日期。获取当前日期需要一个时区,因为对于任何给定时刻,日期在全球各地都会因时区而异。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate ld = LocalDate.now( z ) ;
Month m = ld.getMonth();

Month 枚举自动本地化月份的名称。通过传递TextStyle 控制缩写。

String output = m.getDisplayName( TextStyle.SHORT , Locale.US );

四月

日期与时间

如果您的目标是将时间与日期结合起来,请使用 ZonedDateTime 类。您必须指定一个时区来确定一天中的第一个时刻。在某些区域的某些日期,这一天并非从 00:00:00 开始。

ZonedDateTime zdt = ld.atStartOfDay( z ) ;  // Determine the first moment of the day.

不要使用java.sql.Timestamp 来生成字符串。使用 DateTimeFormatter 类,在 Stack Overflow 上的许多其他答案中都有记录。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MMM-dd HH:mm:ss" , Locale.US ) ;
String output = zdt.format( f ) ;

或者只是调用ZonedDateTime::toString 以生成标准 ISO 8601 格式的字符串,明智地扩展为在方括号中附加区域名称。

String output = zdt.toString() ;

确实,根本不要使用Timestamp。该类旨在与数据库一起使用,现在从 JDBC 4.2 及更高版本开始被 Instant 取代。


关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

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

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

从哪里获得 java.time 类?

Java SE 8Java SE 9Java SE 10 及更高版本 内置。 标准 Java API 的一部分,带有捆绑实现。 Java 9 添加了一些次要功能和修复。 Java SE 6Java SE 7 大部分 java.time 功能在ThreeTen-Backport 中向后移植到 Java 6 和 7。 Android 更高版本的 android 捆绑包实现 java.time 类。 对于早期的 Android (ThreeTenABP 项目采用 ThreeTen-Backport(如上所述)。见How to use ThreeTenABP…

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuarter 和more。

【讨论】:

以上是关于从日历java中生成月份字符到变量中的主要内容,如果未能解决你的问题,请参考以下文章

jquery 从返回的数组中生成单个变量

在 Java 中生成当前时间戳

是否有在Java中生成随机字符的功能?

在Java中生成和使用两个密钥进行加密和解密

在Java中生成一个随机字符串[关闭]

在java中生成随机字符串[重复]