java 毫秒 时间 相互转换 15分钟间隔集合

本文介绍了一种生成当前时间前15分钟间隔的时间戳列表的方法。通过调整分钟数并将其转换为毫秒单位,可以确保时间戳准确地反映15分钟的周期性间隔。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有个功能,要获取当前时间以15分钟为间隔的集合数组,一开始用calendar.add(Calendar.MINUTE, -count);方法来获取当前时间前count分钟的时间,循环获取发现有问题,如:当前为10:02,第一次获取的时间为10:00是正确的,循环获取09:45的时间时,就不对了,目前不知道具体是什么原因造成的。现在采用了另外一个方法来获取,当前时间的毫秒数减去15分钟的毫秒数。不多说,看下面的代码:

package cn.sh.ideal.util;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

public class DateUtil {
 
 /**
  *
  * @Title get15MinutesListByCurrentDate
  * @Description 获取长度为length的、时间间隔为15分钟的、长度为length的List集合
  * @param length
  * @return
  * @date Aug 17, 2012
  */
 public static List<String> get15MinutesListByCurrentDate(long length) {
  List<String> dateList = new ArrayList<String>();
  Calendar calendar = Calendar.getInstance();
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");//时间格式
  int minute = calendar.get(Calendar.MINUTE);// 得到分钟
  int count = 0;
  if (minute != 0 && minute != 15 && minute != 30 && minute != 45) { //时间不为00,15,30,45的情况
   for (int i = minute; i >= 0; i--) { //判断距离最近的00,15,30,45的分钟数
    if (i % 15 == 0) {
     break;
    } else {
     count++;
    }
   }
  }
  calendar.add(Calendar.MINUTE, -count); //获取最近的分钟

  int year = calendar.get(Calendar.YEAR); //得到年
  int month = calendar.get(Calendar.MONTH) + 1; //得到月
  int day = calendar.get(Calendar.DAY_OF_MONTH);// 得到天
  int hour = calendar.get(Calendar.HOUR_OF_DAY);// 得到小时
  int mi = calendar.get(Calendar.MINUTE);// 得到分钟
  String date = "";
  if (month < 10) {
   date = year + "0" + month + "" + day + hour + "" + mi; //月分0-9,转换为0开头
  }
  if (mi == 0) {
   date = year + "0" + month + "" + day + hour + "" + mi + "0"; //分钟为00
  }
  date += "00"; //加秒
  try {
   long millionSeconds = sdf.parse(date).getTime(); // 时间转毫秒
   System.out.println(sdf.format(millionSeconds)); //毫秒转时间
   for (long i = 0; i < length; i++) {
    dateList.add(String.valueOf(millionSeconds - i
      * (15 * 60 * 1000)));
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  return dateList;
 }

 public static void main(String[] args) {
  DateUtil.get15MinutesListByCurrentDate(new Long(20));
 }
}

### Apache Spark 中的时间处理功能 Apache Spark 提供了一系列与时间相关的功能和操作,这些功能主要集中在 **Spark SQL** 和 **Structured Streaming** 模块中。以下是关于 Spark 时间处理的关键点: #### 1. 时间戳支持 在 Spark SQL 中,`TIMESTAMP` 类型被广泛用于表示日期和时间。该类型可以存储精确到毫秒级别的日期时间信息[^4]。开发者可以通过 `to_timestamp()` 函数将字符串转换时间戳对象。 ```sql SELECT to_timestamp('2023-10-01 12:34:56', 'yyyy-MM-dd HH:mm:ss') AS timestamp_value; ``` 此函数允许指定自定义的时间格式模式以适应不同的输入数据结构[^4]。 #### 2. 窗口操作 (Window Functions) 窗口函数是 Spark SQL 中一种强大的工具,尤其适用于涉及时间序列分析的任务。常见的窗口函数包括 `ROW_NUMBER()`, `RANK()`, 和 `SUM()` 等。当结合时间字段使用时,它们可以帮助实现诸如滑动平均值或累积求和等功能[^4]。 例如,在 Structured Streaming 中,可以利用基于时间的窗口聚合来统计每分钟内的事件数量: ```scala import org.apache.spark.sql.functions._ val windowedCounts = dataFrame .groupBy(window($"timestamp", "1 minute")) .agg(count("*").as("event_count")) windowedCounts.show() ``` 这里展示了如何创建一个一分钟长度的滚动窗口,并计算每个窗口中的记录数[^2]。 #### 3. 时间间隔运算 除了基本的时间戳外,Spark 还提供了丰富的 API 来处理时间段差异。比如,`datediff()` 可用来获取两个日期之间的天数差;而 `unix_timestamp()` 则能返回给定时间对应的 Unix 时间戳整数值[^4]。 ```python from pyspark.sql import functions as F df = spark.createDataFrame([["2023-10-01"], ["2023-10-15"]], ["date"]) df.select(F.datediff(F.lit("2023-10-10"), df.date).alias("days_diff")).show() ``` 这段代码片段演示了如何计算某固定日期相对于表中各条目日期的距离(单位为日)[^4]。 #### 4. 定时触发器 (Trigger Processing Time) 对于实时流式应用而言,定时机制尤为重要。通过设置合适的触发策略,用户可以让作业按照预设频率定期运行或者仅当新数据到达后再启动新一轮计算[^2]。这种灵活性使得复杂业务逻辑得以高效实施而不浪费资源等待不必要的延迟。 ```java Dataset<Row> result = streamingInputDF.writeStream() .outputMode("append") .trigger(ProcessingTime.create("5 seconds")) // 设置每隔五秒钟刷新一次结果 .start(); ``` 上述 Java 示例设置了每五秒执行一次批处理流程的操作方式。 --- ### 性能优化方向 尽管目前版本已经具备相当完善的特性集合,但正如官方文档所提到那样,围绕着内存分配、线程调度以及跨节点间消息传递等方面的进一步调优工作仍在持续开展当中[^3]。这意味着未来可能会看到更加智能化自动调整参数的能力加入进来从而简化开发人员的工作负担同时也提高了整体系统的吞吐量表现水平。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值