.Net日期时间帮助类(二)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ZC.Utils
{
    public class TimeHelper
    {

/// <summary>
        /// 计算时间过去了几天
        /// </summary>
        /// <param name="dtime">过去时间</param>
        /// <returns></returns>
        public static int SubDay(DateTime dtime)
        {
            return DateTime.Now.Subtract(dtime).Days;
        }

/// <summary>
        /// 是否今天
        /// </summary>
        /// <param name="dtime"></param>
        /// <returns></returns>
        public static bool IsToDay(DateTime dtime)
        {
            return dtime.Date == DateTime.Now.Date;
        }

/// <summary>
        /// 取指定日期是一年中的第几周
        /// </summary>
        /// <param name="dtime">给定的日期</param>
        /// <returns>数字 一年中的第几周</returns>
        public static int WeekOfYear(DateTime dtime)
        {
            try
            {
                //确定此时间在一年中的位置
                int dayOfYear = dtime.DayOfYear;
                //当年第一天
                DateTime tempDate = new DateTime(dtime.Year, 1, 1);
                //确定当年第一天
                int tempDayOfWeek = (int)tempDate.DayOfWeek;
                tempDayOfWeek = tempDayOfWeek == 0 ? 7 : tempDayOfWeek;
                ////确定星期几
                int index = (int)dtime.DayOfWeek;
                index = index == 0 ? 7 : index;

//当前周的范围
                DateTime retStartDay = dtime.AddDays(-(index - 1));
                DateTime retEndDay = dtime.AddDays(6 - index);

//确定当前是第几周
                int weekIndex = (int)Math.Ceiling(((double)dayOfYear + tempDayOfWeek - 1) / 7);

if (retStartDay.Year < retEndDay.Year)
                {
                    weekIndex = 1;
                }

return weekIndex;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }

}

/// <summary>
        /// 求某年有多少周
        /// </summary>
        /// <param name="dtime"></param>
        /// <returns></returns>
        public static int GetWeekOfYear(DateTime dtime)
        {
            int countDay = DateTime.Parse(dtime.Year + "-12-31").DayOfYear;
            int countWeek = countDay / 7;
            return countWeek;
        }

//根据年月日获得星期几
        public static string CaculateWeekDay(int month, int day)
        {
            string weekstr = string.Empty;
            int year = DateTime.Now.Year;
            //把一月和二月看成是上一年的十三月和十四月
            if (month == 1) { month = 13; year--; }
            if (month == 2) { month = 14; year--; }
            int week = (day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year / 100 + year / 400) % 7;
            switch (week)
            {
                case 0: weekstr = "1"; break;
                case 1: weekstr = "2"; break;
                case 2: weekstr = "3"; break;
                case 3: weekstr = "4"; break;
                case 4: weekstr = "5"; break;
                case 5: weekstr = "6"; break;
                case 6: weekstr = "7"; break;
            }
            return weekstr;
        }

/// <summary>
        /// 根据2个时间段获得相应的周数
        /// </summary>
        /// <param name="beginDate"></param>
        /// <param name="endDate"></param>
        /// <returns></returns>
        public static int WeekOfDate(DateTime beginDate, DateTime endDate)
        {
            TimeSpan ts1 = new TimeSpan(beginDate.Ticks);
            TimeSpan ts2 = new TimeSpan(endDate.Ticks);
            TimeSpan ts = ts2.Subtract(ts1).Duration();
            int weeks = ts.Days / 7;

//确定此时间在一年中的位置
            int dayOfYear = beginDate.DayOfYear;
            //当年第一天
            DateTime tempDate = new DateTime(beginDate.Year, beginDate.Month, beginDate.Day);
            //最后一天
            DateTime tempendDate = new DateTime(endDate.Year, endDate.Month, endDate.Day);
            int tempDayOfWeek = (int)tempDate.DayOfWeek;
            tempDayOfWeek = tempDayOfWeek == 0 ? 7 : tempDayOfWeek;

////确定星期几
            int startindex = (int)beginDate.DayOfWeek;
            startindex = startindex == 0 ? 7 : startindex;
            //当前周的范围
            DateTime retStartDay = beginDate.AddDays(-(startindex - 1));
            DateTime retEndDay = beginDate.AddDays(7 - startindex);
            //确定当前是第几周
            int weekIndex = (int)Math.Ceiling(((double)dayOfYear + tempDayOfWeek - 1) / 7);

return weeks;
        }

/// <summary>
        /// 根据起始时间,获取第几周
        /// </summary>
        /// <param name="dtime">当前时间</param>
        /// <returns></returns>
        public static int WeekOfTermDate(DateTime dtime)
        {
            string datetime = "2011-3-1";

TimeSpan ts1 = new TimeSpan(dtime.Ticks);
            TimeSpan ts2 = new TimeSpan(Convert.ToDateTime(datetime).Ticks);
            TimeSpan ts = ts2.Subtract(ts1).Duration();

//确定此时间在一年中的位置
            int dayOfYear = ts.Days;
            //当年第一天
            DateTime tempDate = new DateTime(Convert.ToDateTime(datetime).Year, Convert.ToDateTime(datetime).Month, Convert.ToDateTime(datetime).Day);

int tempDayOfWeek = (int)tempDate.DayOfWeek;
            tempDayOfWeek = tempDayOfWeek == 0 ? 7 : tempDayOfWeek;
            ////确定星期几
            int index = (int)dtime.DayOfWeek;
            index = index == 0 ? 7 : index;

//当前周的范围
            DateTime retStartDay = dtime.AddDays(-(index - 1));
            DateTime retEndDay = dtime.AddDays(7 - index);

//确定当前是第几周
            int weekIndex = (int)Math.Ceiling(((double)dayOfYear + tempDayOfWeek) / 7);
            return weekIndex;
        }

/// <summary>
        /// 根据周,星期获得具体年月日
        /// </summary>
        /// <param name="week">第几周</param>
        /// <param name="day">星期几</param>
        /// <returns></returns>
        public static DateTime DateTimeByWeekAndDay(int week, int day)
        {
            DateTime someTime = Convert.ToDateTime("2011-3-1");

int i = someTime.DayOfWeek - DayOfWeek.Monday;
            if (i == -1) i = 6;// i值 > = 0 ,因为枚举原因,Sunday排在最前,此时Sunday-Monday=-1,必须+7=6。
            TimeSpan ts = new TimeSpan(i, 0, 0, 0);

//获取第N周的星期一
            someTime = someTime.Subtract(ts).AddDays((week - 1) * 7);
            //获得星期几
            someTime = someTime.AddDays(day - 1);
            return someTime;
        }
    }
}

时间: 2024-10-17 02:07:57

.Net日期时间帮助类(二)的相关文章

Java日期时间API系列11-----Jdk8中java.time包中的新的日期时间API类,使用java8日期时间API重写农历LunarDate

通过Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的优点,java8具有很多优点,现在网上查到的农历转换工具类都是基于jdk7及以前的类写的,下面使用java新的日期时间API重写农历LunarDate. package com.xkzhangsan.time; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import ja

Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的特点

1.不变性 新的日期/时间API中,所有的类都是不可变的,这对多线程环境有好处. 比如:LocalDateTime 2.关注点分离 新的API将人可读的日期时间和机器时间(unix timestamp)明确分离,它为日期(Date).时间(Time).日期时间(DateTime).时间戳(unix timestamp)以及时区定义了不同的类. 不同时间分解成了各个类,比如:LocalDate, LocalTime, LocalDateTime, Instant,Year,Month,YearMo

Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析

目录 0.前言 1.TemporalAccessor源码 2.Temporal源码 3.TemporalAdjuster源码 4.ChronoLocalDate源码 5.LocalDate源码 6.总结 0.前言 通过前面Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类中主要的类关系简图如下: 可以看出主要的LocalDate, LocalTime, LocalDateTime, Instant都是实现相同的接口,这里以LocalDate为例分析jav

Java日期时间API系列13-----Jdk8中java.time包中的新的日期时间API类,时间类转换,Date转LocalDateTime,LocalDateTime转Date

从前面的系列博客中可以看出Jdk8中java.time包中的新的日期时间API类设计的很好,但Date由于使用仍非常广泛,这就涉及到Date转LocalDateTime,LocalDateTime转Date.下面是时间类互相转换大全,包含Instant.LocalDate.LocalDateTime.LocalTime和Date的相互转换,下面是一个工具类,仅供参考: package com.xkzhangsan.time.converter; import java.time.Instant;

Java日期时间API系列17-----Jdk8中java.time包中的新的日期时间API类,java日期计算4,2个日期对比,获取相差年月日部分属性和相差总的天时分秒毫秒纳秒等

通过Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别 ,可以看出java8设计非常好,新增了Period和Duration类,专用于对比2个时间场景: Period,可以获取2个时间相差的年月日的属性. Duration,可以获取2个时间相差总的天时分秒毫秒纳秒. 下面应用: /** * 获取2个日期的相差年月天的年数部分 * @param startInclusive * @param endExclusive

Java日期时间API系列20-----Jdk8中java.time包中的新的日期时间API类,ZoneId时区ID大全等。

Java日期时间API系列19-----Jdk8中java.time包中的新的日期时间API类,ZonedDateTime与ZoneId和LocalDateTime的关系,ZonedDateTime格式化和时区转换等.中已经对ZoneId说明,并列出了常用时区ID信息. 并且通过 java.time.ZoneId.getAvailableZoneIds()获取到所有可用时区ID. 1.测试代码 /** * 获取可用时区ID */ @Test public void getAvailableZon

Java日期时间API系列19-----Jdk8中java.time包中的新的日期时间API类,ZonedDateTime与ZoneId和LocalDateTime的关系,ZonedDateTime格式化和时区转换等。

通过Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类中时间范围示意图:可以很清晰的看出ZonedDateTime相当于LocalDateTime+ZoneId. ZonedDateTime是用来处理时区相关的时间,它的各种计算都离不开ZoneId.先看ZoneId. 1. ZoneId 为时区ID,比如Europe/Paris,表示欧洲巴黎时区 1.1 时区相关知识,时区,UTC时间,GMT时间,Unix时间戳 时区 地球自西向东旋转,东边比西边先看到

日期时间处理类

java.util.Date类,默认格式:Thu Feb 25 21:32:59 CST 2016,“星期 月份 日期 时间 中国标准时间 年份” 的格式不是很友好. java.text.SimpleDateFormate类:格式化时间的类,用法如下:----------------------------------按格式输出时间 Date d=new Date();  SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss

日期时间工具类

1. 日期格式工具类: package com.ant.jdk8.lang; import org.apache.commons.lang3.time.DateFormatUtils; import java.util.Date; /** * @author wangll * @date 2018/7/17 */ public class DateFormatDemo { public static void main(String[] args) { System.out.println(Da

Java日期时间API系列10-----Jdk8中java.time包中的新的日期时间API类的DateTimeFormatter

1.DateTimeFormatter final修饰,线程安全,用于打印和解析日期-时间对象的格式化程序. 创建DateTimeFormatter: DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()); 2.格式化日期 例如:LocalDateTime LocalDateTime localDa