在测试我的一些方法时,我遇到了一个奇怪的问题,我似乎已经能够获得我的问题的具体例子.
我使用的ja_JP_JP_#u-ca-japanese语言环境无法使用由语言环境定义的自己的日期模式来解析日期.
我想知道我做错了什么,或者这是否是一个JDK错误.
请注意,为了构造ja_JP_JP_#u-ca-japanese,您需要根据Locale javadoc的new Locale("ja", "JP", "JP")摘录使用:
特别案例
出于兼容性原因,两个不符合要求的语言环境被视为特殊情况.这些是ja_JP_JP和th_TH_TH.这些在BCP 47中是不正确的,因为变体太短.为了便于迁移到BCP 47,这些都在施工期间得到了特殊处理.这两种情况(并且只有这些)导致构造函数生成扩展,所有其他值的行为与Java 7之前完全相同.
Java使用ja_JP_JP代表日本和日本帝国日历一起使用日语.现在可以使用Unicode语言环境扩展来表示,通过指定Unicode语言环境键ca(对于"calendar")并键入japanese.当使用参数"ja","JP","JP"调用Locale构造函数时,会自动添加扩展名"u-ca-japanese".
Java使用th_TH_TH来表示泰国使用的泰语以及泰国数字.现在,使用Unicode语言环境扩展,通过指定Unicode语言环境键nu(用于"数字")和值泰语,也可以表示这一点.当使用参数"th","TH","TH"调用Locale构造函数时,会自动添加扩展名"u-nu-thai".
给出的测试用例演示了这个问题:
@Test
public void testJapaneseLocale() {
LocalDate specificLocalDate = LocalDate.of(2014, 10, 2);
Locale jpLocale = new Locale("ja", "JP", "JP");
DateTimeFormatter jpDateTimeFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(jpLocale);
String jpDate = specificLocalDate.format(jpDateTimeFormatter);
String jpPattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.SHORT, null, Chronology.ofLocale(jpLocale), jpLocale);
LocalDate jpLocalDate = LocalDate.parse(jpDate, DateTimeFormatter.ofPattern(jpPattern, jpLocale));
assertEquals(specificLocalDate, jpLocalDate);
}
Run Code Online (Sandbox Code Playgroud)
此代码适用于任何其他常规语言环境,例如英语等.
我有一个数据类型的bean:
private java.time.Duration duration
Run Code Online (Sandbox Code Playgroud)
class属性设置如下:
object.setDuration(Duration.ofSeconds(2));
Run Code Online (Sandbox Code Playgroud)
我想将我的对象编组为xml,以便持续时间看起来像那样
<duration>PT2S</duration>
Run Code Online (Sandbox Code Playgroud)
如ISO 8601所定义
据我所知,Jaxb使用默认绑定数据类型,如:
xsd:duration javax.xml.datatype.Duration
Run Code Online (Sandbox Code Playgroud)
但在我的bean中,我不想包含任何xml依赖项.
我看到编写包装器的可能性,我可以在其中添加XmlAdapter,但我不知道如何将java.time.Duration转换为javax.xml.datatype.Duration
我面临的问题是我需要将时间从24格式转换为AM/PM格式(反之亦然),通过time4j库删除冗余值,如纳秒和秒.
我正在使用time4j库,因为Java无法处理Windows时区,我必须通过time4j进行转换
从24小时格式转换为AM/PM将取决于用户本地化.我想把它(本地化)作为一个论点传播.本地化将看起来像"en-US"字符串.
例如:如果用户本地化为"en-US",则将24小时格式转换为AM/PM.否则保持当前价值.
或者,当我已经定义了用户的本地化时,最好是以我需要的格式获得时间?
任何想法如何做到这一点?请帮忙)
我必须花很多时间阅读time4j doc,但我的思绪已被吹嘘
要全面了解我正在做的事情以及所有这一切的目的:
我必须从我的数据库中获取用户timeZone,这对应于Windows时区并将其转换为IANA时区.我已经通过这种方法做到了这一点
WindowsZone wzn = WindowsZone.of(userTimeZoneId); //userTimeZoneId="eg. FLE Standart Time"
TZID winZone = wzn.resolveSmart(new Locale("","001"));
System.out.println(winZone.canonical()); // WINDOWS~Europe/Kiev
Run Code Online (Sandbox Code Playgroud)
其中"userTimeZoneId"是来自DB的timeZone.它对应于Microsoft时区名称
我的下一步是从用户时区获取时间/或时间戳,我已将其转换为IANA时区.
我喜欢这样:
PlainTime currentTime = SystemClock.inZonalView(winZone).now().toTime();
//currentTime: "T17:31:37,057"
Run Code Online (Sandbox Code Playgroud)
"winZone"转换时区的地方(例如"WINDOWS~Europe/Kiev")
所以现在回到我在帖子顶部描述的问题.
当我已经定义了用户的本地化时,最好是以我需要的格式获得时间?
如何将时间从24格式转换为AM/PM,反之亦然?
如何删除多余的值,如纳秒和秒?
如何在转换中使用用户本地化?
我需要使用 Java 8 日期和时间 API ( java.time )找到一年最后一周的第一天,最后得出了这个解决方案:
LocalDate date = LocalDate.of(2016, 2, 17);
LocalDate lastWeekOfYear = LocalDate.of(date.getYear() + 1, 1, 7)
.with(WeekFields.ISO.weekOfYear(), 1)
.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)).minusDays(7);
Run Code Online (Sandbox Code Playgroud)
此解决方案查找下一年的第一周,必要时将星期几调整为星期一,然后将 7 天后移。有没有更聪明的方法来达到同样的结果?
我试图java.time.LocalDate在我的报告中显示以下格式:
<textField pattern="EEEEE dd MMMMM yyyy">
<reportElement x="64" y="0" width="150" height="20" uuid="5e003c53-2327-4f75-9adf-831a3bb494ff"/>
<textElement verticalAlignment="Middle">
<font isBold="true" isUnderline="true"/>
</textElement>
<textFieldExpression><![CDATA[$F{dateFacture}]]></textFieldExpression>
</textField>
Run Code Online (Sandbox Code Playgroud)
但我得到的日期如下:2017-03-09。是由于 java.time.LocalDate 类型造成的吗?
我有一个包含 java.time.LocalDateTime 类型的属性的类。
public class MyClass{
// ...
private LocalDateTime fecha;
// ...
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 Spring Data 存储库。我想要完成的是根据日期查询实体:
@Service
public interface IRepository extends CrudRepository<MyClass, UUID> {
// ...
public void deleteByFecha(LocalDate fecha);
// ...
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为抛出异常:
org.springframework.dao.InvalidDataAccessApiUsageException: 参数值 [2016-10-05] 与预期类型 [java.time.LocalDateTime (n/a)] 不匹配;
所以问题是如何通过fecha但使用 LocalDate查询数据库中的 MyClass ?
编辑 以防万一有人面临同样的问题,我想出了一个解决方案:修改存储库的方法,使其看起来如下:
import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
// ...
@Service
public interface IRepository extends CrudRepository<MyClass, UUID> {
@Transactional
@Modifying
@Query("DELETE FROM MyClass mtc WHERE YEAR(mtc.fecha)=?1 AND MONTH(mtc.fecha)=?2 AND DAY(mtc.fecha)=?3")
public …Run Code Online (Sandbox Code Playgroud) 有没有办法以秒为单位获取当天的当前时间?请注意,我问的是一天中的时间,而不是 UTC 时间。
我想要的是介于0 - 86,400 (12:00AM - 11:59PM)之间的值(以秒为单位)。我正在开发一个每天运行的应用程序,当一天结束时,时间(以秒为单位)应该重新开始0。
所以让我们说它是10:00AM。我应该得到36,000秒,如果我的时间是5:00PM,我应该得到61,200秒。
PS:我不知道手头的时间。该程序将使用currentTime()函数自行计算。
我有一个关于 java 的问题DataTimeFormmater。我觉得我错过了一些东西,但又不知道到底错过了什么。
String format = "yyyy-MM-dd'T'HH:mm:ss[.S]'T'zxxx";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
String date = "2017-07-05T12:28:36.4TGMT+03:00";
System.out.println(formatter.format(ZonedDateTime.now()));
System.out.println(formatter.parse(date));
Run Code Online (Sandbox Code Playgroud)
上面的代码生成当前的字符串ZonedDateTime,并尝试使用相同的日期格式化程序解析日期时间字符串。2017-07-05T06:07:51.0TCDT-05:00成功生成但无法解析的结果2017-07-05T12:28:36.4TGMT+03:00
我的目标是解析2017-07-05T12:28:36.4TGMT+03:00并提出适当的DateTimeFormatter.
我需要在 Java 8 中模拟时间(到特定日期,这意味着我可能不会使用anyLong())以java.time在 EasyMock 下的测试环境中单独使用,因此没有 Joda Time。
EasyMock 不允许你模拟像LocalDateTime.now(). PowerMock 可以,但我不允许使用 PowerMock。
Joda Time 库提供了一种简洁优雅的方式来模拟时间DateTimeUtils.setCurrentMillisFixed(),并DateTimeUtils.setCurrentMillisSystem()回到现在的瞬间。
只有我不允许使用 Joda Time。
我被告知使用模拟时钟java.time.Clock类实例并将其注入LocalDateTime.now()如下:LocalDateTime.now(mockClock)
有没有办法在没有 Joda Time和 PowerMock 的情况下正确实现它?
ZonedDateTime我正在使用 JDK 8,并且Timestamp经常使用它。但我仍然无法解决我面临的问题。
假设我得到了TimestampGMT (UTC) 格式的文件,并且我的服务器位于某处。假设它设置为Asia/CalcuttaTimeZone (其 ZoneOffset 为+05:30)。
基本上如何在时间戳中添加/减去我的时区偏移量?
Input : 2017-09-13 13:10:30.333
Output: 2017-09-13 18:40:30.333
Run Code Online (Sandbox Code Playgroud)
解释 :在输入中,时区偏移量 5hrs 30mts 已添加到输入中。此外,输入是 Timestamp 类型,输出也是 Timestamp 类型。
我使用ZoneID.systemDefault()函数来检索 JVM 已知的时区。就我而言,时区结果是Asia/Calcutta.