从日历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.Date
、java.util.Calendar
和 java.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.Date
、java.util.Calendar
和 java.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.Date
、Calendar
和 SimpleDateFormat
。
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 8、Java SE 9、Java SE 10 及更高版本 内置。 标准 Java API 的一部分,带有捆绑实现。 Java 9 添加了一些次要功能和修复。 Java SE 6 和 Java 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 的试验场。您可以在这里找到一些有用的类,例如Interval
、YearWeek
、YearQuarter
和more。
【讨论】:
以上是关于从日历java中生成月份字符到变量中的主要内容,如果未能解决你的问题,请参考以下文章