标签: java-time

如何将 UTC 时间转换为其他时区(“CST”、“IST”)

在我的 Android 应用程序服务器中,将返回UTC以下格式的日期(yyyy-MM-dd HH:mm:ss24 小时),我需要将这些时间转换为用户的时区,例如CST,IST。

我做了以下代码,但我知道它是否正确,请帮助我以正确的方式进行时区转换。

我将 UTC 日期作为 json 字符串并转换为用户的时区格式并显示 Android 端

private static Date utcDate;
private static DateFormat expireFormat = new SimpleDateFormat(
        "yyyy-MM-dd HH:mm:ss");

        try {
            expireFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
            utcDate = expireFormat.parse("2014-04-01 10:32:00");
            System.out.println(TimeZone.getDefault().getID());
            expireFormat.setTimeZone(TimeZone.getTimeZone(TimeZone.getDefault().getID()));
            System.out.println(expireFormat.format(utcDate));
        } catch (ParseException e) {
            e.printStackTrace();
        }

    output of the code:
    Asia/Calcutta
    2014-04-01 16:02:00
Run Code Online (Sandbox Code Playgroud)

java timezone android java-time

5
推荐指数
1
解决办法
5444
查看次数

如何使用 JPA 和 Hibernate 保留 OffsetTime 和 OffsetDateTime

如何将 Java 8OffsetTime和OffsetDateTimeHibernate 持久化为正确的 SQL 类型(TIME_WITH_TIMEZONE和TIMESTAMP_WITH_TIMEZONE)?我在博客中找到LocalTime并LocalDateTime使用了EnhancedUserTypes的解决方案。

用户类型如何用于偏移数据?

java hibernate hibernate-mapping java-8 java-time

5
推荐指数
1
解决办法
5079
查看次数

如何在 Java 8 中正确使用 ZoneOffset、ZoneId 和 LocalDateTime?

这里的目标是将 LocalDateTime 来回转换为纪元秒。

假设我有一个 LocalDateTime 定义为:

LocalDateTime now = LocalDateTime.now();
Run Code Online (Sandbox Code Playgroud)

我想将其转换为亚洲/加尔各答时区的纪元秒,我可以这样做:

long epochSecondNow = now.atZone(ZoneId.of("Asia/Kolkata")).toEpochSecond();
Run Code Online (Sandbox Code Playgroud)

现在,我想从 epochSecondNow 再次生成“现在”:

LocalDateTime 类有一个方法 ' ofEpochSecond(long epochSecond,long nanoOfSecond, ZoneOffset zoneOffset)',它以纪元秒、nano of second 和 ZoneOffset 作为参数。

我无法使用“Asia/Kolkata”创建 ZoneOffset。我应该如何为我的区域制作 ZoneOffset 对象以使用 'ofEpochSecond' 方法。有没有其他办法?

谢谢!

java java-time

5
推荐指数
2
解决办法
1万
查看次数

使用 java.time 查找一年最后一周的第一天

我需要使用 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 date java-time

5
推荐指数
1
解决办法
2083
查看次数

如何使用 LocalDate 查询 LocalDateTime?

我有一个包含 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)

java spring spring-data java-time spring-repositories

5
推荐指数
1
解决办法
1万
查看次数

以秒为单位获取当前时间

有没有办法以秒为单位获取当天的当前时间?请注意,我问的是一天中的时间,而不是 UTC 时间。

我想要的是介于0 - 86,400 (12:00AM - 11:59PM)之间的值(以秒为单位)。我正在开发一个每天运行的应用程序,当一天结束时,时间(以秒为单位)应该重新开始0。

所以让我们说它是10:00AM。我应该得到36,000秒,如果我的时间是5:00PM,我应该得到61,200秒。

PS:我不知道手头的时间。该程序将使用currentTime()函数自行计算。

java java-time

5
推荐指数
1
解决办法
6206
查看次数

如何使用PowerMock模拟LocalDate.now()

我只想要嘲笑now()的LocalDate使用PowerMock.它似乎忽略了thenReturn价值:

java.lang.AssertionError: 
Expected :2008
Actual   :2017
Run Code Online (Sandbox Code Playgroud)

测试设置:

@PrepareForTest(LocalDate.class)
@RunWith(PowerMockRunner.class)
public class UserTest {

    @Test
    public void nowShouldReturnSameYear() throws Exception {
        LocalDate expected = LocalDate.parse("2008-04-04");

        PowerMockito.spy(LocalDate.class);
        when(LocalDate.now()).thenReturn(parse);

        Foo foo = new Foo();
        assertEquals(expected.getYear(), foo.getRightNow().getYear());
    }
Run Code Online (Sandbox Code Playgroud)

Foo.java

public LocalDate getRightNow(){
        final LocalDate rightNow = LocalDate.now();
        return rightNow;
    }
Run Code Online (Sandbox Code Playgroud)

java mockito powermock java-time

5
推荐指数
1
解决办法
2456
查看次数

如何使用 EasyMock、没有 Joda Time 和 PowerMock 在 Java 8 Web 应用程序中将当前系统时间覆盖为特定日期?

我需要在 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 的情况下正确实现它?

junit easymock junit4 java-8 java-time

5
推荐指数
1
解决办法
2541
查看次数

在 MySql TIME 列中保存 LocalTime

背景故事

我最近遇到了LocalTime将 a保存到TIMEMySQL 数据库中的列的问题。保存 的值9:00会导致8:00保存在数据库中。

这个问题在我的开发环境(Windows)上没有发生,但在我们试过的两台 Linux 机器上确实发生了。

我的代码如下:

preparedStatement.setObject(parameterIndex, localTime, JDBCType.TIME);
Run Code Online (Sandbox Code Playgroud)

经过调查,我最终发现 MySQL JDBC 驱动程序正在使用java.sql.Time.valueOf(localTime),然后使用 将SimpleDateFormat其时区设置为 MySql 服务器的system_time_zone系统属性(via time_zone = 'SYSTEM'),将其打印为字符串。

在 Linux 机器上,system_time_zone是GMT,而在 Windows 机器上,它是GMT Standard Time. (我在英国。)

因此, theLocalTime 9:00被转换为 a Timeof 9:00 Europe/London(实际上在内部建模为1st January 1970 9:00 Europe/London),然后使用GMT时区将其写出,该时区与UTC. 现在,通常这两个时区在 1 月份与 UTC 的偏移量为零,但英国在 1969 年和 1970 …

java mysql localtime java-time

5
推荐指数
0
解决办法
980
查看次数

Jackson 将 Instant 序列化为纳秒问题

Jackson串行化java.time.Instant与WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS默认启用。

它JSON是这样产生的

{ "timestamp":1421261297.356000000 }
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法摆脱最后的零。我想要这样的东西:

{ "timestamp":1421261297.356 }
Run Code Online (Sandbox Code Playgroud)

我试过:

mapper.configure( SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false );
mapper.configure( SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true );
Run Code Online (Sandbox Code Playgroud)

但是此配置将其更改为毫秒表示1421261297356。我想要秒部分和小数毫秒部分。

java serialization json jackson java-time

5
推荐指数
1
解决办法
4882
查看次数