时区设置和 某段日期内订单汇总

文章提供了一个用于从数据库查询订单统计信息的Java类OrderStatisticsQuery,包含开始和结束日期属性,处理日期格式化和时区问题。SQL查询从imooc_mall_order表中按日期分组统计订单数量,支持时间范围筛选。同时,展示了如何在SpringBoot应用中配置Jackson以适应不同的日期格式和时区。
public class OrderStatisticsVO {
    //日期
    private Date days;
//多少订单
    private Integer amount;
}
   

查询封装


/**
 * @Author: jsh
 * @Describe: 往数据库查询使用                     订单量统计的Query
 * @Initialize the classpath:           com.imooc.mall.model.query.OrderStatisticsQuery
 * @System Username:                    song
 * @project name:                       spring-boot-mall-shizhan
 * @creation time:                      2023-06-02 09:50
 * @Versions 1.0
 */
public class OrderStatisticsQuery {
//    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date startDate;
//    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date endDate;
    }

sql 如果需要话可以加字段 成正序或者倒叙


    <resultMap id="listOrderStatisticsMap" type="com.imooc.mall.model.vo.OrderStatisticsVO">
        <result column="days" jdbcType="TIMESTAMP" property="days"/>
        <result column="amount" jdbcType="INTEGER" property="amount"/>
    </resultMap>
    <select id="selectOrderStatistics" resultMap="listOrderStatisticsMap">
        select date_format(FROM_UNIXTIME(UNIX_TIMESTAMP(create_time)), '%Y-%m-%d')
        as days,
        count(*) as amount
        from imooc_mall_order

        <where>
            <if test="query.startDate != null">
                <![CDATA[ and create_time >= #{query.startDate} ]]>
            </if>
            <if test="query.endDate != null">
                <![CDATA[ and create_time <= #{query.endDate} ]]>
            </if>
        </where>
        group by days
        order by days
    </select>

时区问题

  1. 查看mysql的时区
select   now()
  1. 查看springboot时区
@SpringBootApplication
public class MallApplication {

    public static void main(String[] args) {
        //输出时间
        System.out.println(TimeZone.getDefault());
        SpringApplication.run(MallApplication.class, args);
    }
}
  1. json转换配置时区(配置(yaml)
spring:
  jackson:
    time-zone: Asia/Shanghai
    date-format: yyyy-MM-dd HH:mm:ss

或者之接配置某字段

public class OrderStatisticsVO {
    //日期
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date days;
//多少订单
    private Integer amount;

### Java 中使用 `DateTimeFormatter` 设置日期格式时区Java中,`DateTimeFormatter` 类提供了强大的功能来处理日期时间的格式化解析。为了设置日期格式并指定时区,通常会结合 `ZonedDateTime` 使用。 #### 创建带有时区日期时间格式器 可以通过调用 `ofPattern()` 方法创建具有自定义模式的 `DateTimeFormatter` 实例,并通过传递带有区域ID的时间对象来进行格式化: ```java import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; // 定义一个包含时区信息的日期时间格式 ZoneId zone = ZoneId.of("America/New_York"); ZonedDateTime zdt = ZonedDateTime.now(zone); // 自定义格式样式 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss VV"); String formattedDate = zdt.format(formatter); System.out.println(formattedDate); // 输出当前纽约时间,格式为:年-月-日 小时:分钟:秒 时区ID ``` 上述代码片段展示了如何利用 `DateTimeFormatter` 的 `ofPattern(String pattern)` 构造函数来自定义输出格式[^1]。这里使用的 `"VV"` 符号表示通用时区 ID,这有助于显示完整的时区名称而不是偏移量。 对于更复杂的场景,如果需要考虑本地化的语言环境,则可以进一步增强 `DateTimeFormatter` 的配置: ```java import java.util.Locale; Locale locale = Locale.US; // 或者其他地区如 Locale.CHINA, Locale.FRANCE 等 DateTimeFormatter localizedFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withLocale(locale).withZone(zone); formattedDate = zdt.format(localizedFormatter); System.out.println(formattedDate); // 根据所选地区的习惯格式化时间日期 ``` 这段代码说明了怎样基于不同的文化习俗调整日期/时间表达方式的同时保持相同的时区设定[^2]。 #### 解析含有时区信息的字符串到 `ZonedDateTime` 除了格式化外,还可以反向操作——即把符合预期格式的字符串转换回 `ZonedDateTime` 对象: ```java String input = "2023-10-05 14:48:32 America/Los_Angeles"; formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss VV").withZone(ZoneId.systemDefault()); zdt = ZonedDateTime.parse(input, formatter.withZone(ZoneId.of("UTC"))); System.out.println(zdt); // 转换成 UTC 时间打印出来 ``` 此部分解释了当给定一个已知格式且包含有效时区标识符的输入串时,应如何将其正确地映射至相应的 `ZonedDateTime` 结构内。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值