码迷,mamicode.com
首页 > 编程语言 > 详细

Unix时间戳转日期时间格式,C#、Java、Python各语言实现!

时间:2017-07-04 13:20:39      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:开始   bool   created   att   simple   import   ota   创建   strftime   

之前有个Q上好友没事问我,怎么自己写Unix时间戳转日期时间?于是我就顺手写了个C#版本给他!最近想起来,就萌发多写几个语言的版本分享,权当练习思路外加熟悉另外两种语言。

 

先说转换步骤

  1. 先处理年份,从1970年开始处理,根据平年闰年的总秒数,先得到年,剩余的秒数再求月份;
  2. 根据剩余秒数求得月份,因为2月的缘故,同样需要处理平年闰年‘;
  3. 得天数,直接除以每天的总秒数,然后取得天;
  4. 取小时、分钟、秒;

Python版本:

# -*- coding: UTF-8 -*- 
from datetime import datetime, tzinfo, timedelta
import pytz

class DateHelper:
    def unixTimestmpToDate(self,timestamp):
        #计算年
        (remainSeconds,year) = self.__get_year(timestamp)
        (remainSeconds,month) = self.__get_month(remainSeconds,year)
        (remainSeconds,day) = self.__get_day(remainSeconds)
        (remainSeconds,hour) = self.__get_hour(remainSeconds)
        (remainSeconds,minute) = self.__get_minute(remainSeconds)

        result = datetime(year, month, day, hour, minute, remainSeconds, 0, UTC(8))

        print result.strftime(%Y-%m-%d %H:%M:%S,)
       

    def __get_minute(self,timestamp):
        """
        计算分钟
        """
        min = timestamp / 60

        return (timestamp - min * 60, min)

    def __get_hour(self,timestamp):
        """
        计算小时
        """
        hour = timestamp / (60 * 60)

        return (timestamp - hour * 60 * 60, hour)

    def __get_day(self,timestamp):
        """
        计算天
        """
        #每天的秒数
        daySeconds = 24 * 60 * 60

        day = timestamp / daySeconds

        return (timestamp - day * daySeconds, day + 1)

    def __get_month(self, timestamp, year):
        """
        计算月份
        """
        #每天的秒数
        daySeconds = 24 * 60 * 60
        #每月的总秒数
        monthDays = [31 * daySeconds, 28 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds]
        
        if self.__is_leap_year(year):
            monthDays[1] = 29 * daySeconds

        totalSeconds = 0
        month = 0
        for second in monthDays:
            month +=1
            if second + totalSeconds > timestamp:
                break

            totalSeconds += second

        return (timestamp - totalSeconds, month)

    def __get_year(self,timestamp):
        """
        计算年份
        """
        year = 1969
        totalSeconds = 0

        while True:
            year +=1
            second = self.__get_year_seconds(year)
            #年份总秒数大于时间戳
            if totalSeconds + second > timestamp:
                break

            totalSeconds += second
           

        return (timestamp - totalSeconds,year)

    def __get_year_seconds(self,year):
        ‘‘‘
        得到每一年的总秒数
        ‘‘‘
        isLeapYear = self.__is_leap_year(year)

        if isLeapYear:
            return 366 * 24 * 60 * 60
        else:
            return 365 * 24 * 60 * 60

    def __is_leap_year(self,year):
        ‘‘‘
        判断是否闰年
        ‘‘‘
        if year % 4 == 0 and year % 100 != 0:
            return True
        elif year % 400 == 0:
            return True
        else:
            return False

class UTC(tzinfo):    
    """UTC 时区创建"""
    def __init__(self,offset=0):
        self._offset = offset

    def utcoffset(self, dt):
        return timedelta(hours=self._offset)

    def tzname(self, dt):
        return "UTC +%s" % self._offset

    def dst(self, dt):
        return timedelta(hours=self._offset)
        
if __name__ == "__main__":
    datehelper = DateHelper()
    datehelper.unixTimestmpToDate(1483200000)

 C#版本:

class DateHelper
    {
        /// <summary>
        /// unix时间戳转时间
        /// </summary>
        /// <param name="timestamp">时间戳</param>
        /// <returns></returns>
        public static DateTime UixTimestmpToDate(int timestamp)
        {
            int remainSeconds;
            int year = GetYear(timestamp, out remainSeconds);

            int seconds = remainSeconds;
            int month = GetMonth(seconds, year, out remainSeconds);

            // seconds = remainSeconds;
            int day = GetDay(remainSeconds, out remainSeconds);
            int hour = GetHours(remainSeconds, out remainSeconds);
            int minute = GetMinute(remainSeconds, out remainSeconds);

            return new DateTime(year, month, day, hour, minute, remainSeconds);
        }

        /// <summary>
        /// 计算分钟
        /// </summary>
        /// <param name="timestamp"></param>
        /// <param name="remainSeconds">剩余秒数</param>
        /// <returns></returns>
        private static int GetMinute(int timestamp, out int remainSeconds)
        {
            var minute = timestamp / 60;

            remainSeconds = timestamp - minute * 60;

            return minute;
        }

        /// <summary>
        /// 计算小时
        /// </summary>
        /// <param name="timestamp"></param>
        /// <param name="remainSeconds"></param>
        /// <returns></returns>
        private static int GetHours(int timestamp, out int remainSeconds)
        {
            var hour = timestamp / (60 * 60);

            remainSeconds = timestamp - hour * 60 * 60;

            return hour;
        }

        /// <summary>
        /// 计算日
        /// </summary>
        /// <param name="timestamp"></param>
        /// <param name="remainSeconds"></param>
        /// <returns></returns>
        private static int GetDay(int timestamp, out int remainSeconds)
        {
            var daySeconds = 24 * 60 * 60;

            var day = timestamp / daySeconds;

            remainSeconds = timestamp - day * daySeconds;

            return day + 1;
        }

        /// <summary>
        /// 计算月
        /// </summary>
        /// <param name="timestamp"></param>
        /// <param name="year"></param>
        /// <param name="remainSeconds"></param>
        /// <returns></returns>
        private static int GetMonth(int timestamp, int year, out int remainSeconds)
        {
            // 每天的秒数
            var daySeconds = 24 * 60 * 60;
            //每月的总秒数
            var monthDays = new int[] { 31 * daySeconds, 28 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds };


            if (IsLeepYear(year))
                monthDays[1] = 29 * daySeconds;

            var totalSeconds = 0;
            var month = 0;
            foreach (var second in monthDays)
            {
                month += 1;
                if (second + totalSeconds > timestamp)
                    break;

                totalSeconds += second;
            }
            remainSeconds = timestamp - totalSeconds;
            return month;
        }

        /// <summary>
        /// 计算年
        /// </summary>
        /// <param name="timestamp"></param>
        /// <param name="remainSeconds"></param>
        /// <returns></returns>
        private static int GetYear(int timestamp, out int remainSeconds)
        {
            int year = 1969, totalSeconds = 0;

            while (true)
            {
                year += 1;
                int second = GetYearSeconds(year);
                //年份总秒数大于时间戳
                if (totalSeconds + second > timestamp)
                    break;

                totalSeconds += second;

            }

            remainSeconds = timestamp - totalSeconds;

            return year;
        }

        /// <summary>
        /// 得到每一年的总秒数
        /// </summary>
        /// <param name="year"></param>
        /// <returns></returns>
        private static int GetYearSeconds(int year)
        {
            if (IsLeepYear(year))
                return 366 * 24 * 60 * 60;
            else
                return 365 * 24 * 60 * 60;
        }

        /// <summary>
        /// 判断闰年
        /// </summary>
        /// <param name="year"></param>
        /// <returns></returns>
        private static bool IsLeepYear(int year)
        {

            if (year % 4 == 0 && year % 100 != 0)
                return true;
            else if (year % 400 == 0)
                return true;
            else
                return false;
        }

 

/**
 * Created by chong on 2017/7/4.
 */
public class DateHelper {
    /**
     * unix时间戳转时间
     *
     * @param timestamp 时间戳
     * @return
     * @throws ParseException
     */
    public static Date uixTimestmpToDate(int timestamp) throws ParseException {
        int[] year = GetYear(timestamp);
        int[] month = GetMonth(year[1], year[0]);
        int[] day = GetDay(month[1]);
        int[] hour = GetHours(day[1]);
        int[] minute = GetMinute(hour[1]);

        String strDate = String.format("%d-%d-%d %d:%d:%d", year[0], month[0], day[0], hour[0], minute[0], minute[1]);


        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //这次没有处理时区,所以直接输出的是UTC时间
        Date strtodate = formatter.parse(strDate);

        return strtodate;
    }

    /**
     * 计算分钟
     *
     * @param timestamp
     * @return
     */
    private static int[] GetMinute(int timestamp) {
        int minute = timestamp / 60;

        int remainSeconds = timestamp - minute * 60;

        return new int[]{minute, remainSeconds};
    }

    /**
     * 计算小时
     *
     * @param timestamp
     * @return
     */
    private static int[] GetHours(int timestamp) {
        int hour = timestamp / (60 * 60);

        int remainSeconds = timestamp - hour * 60 * 60;

        return new int[]{hour, remainSeconds};
    }

    /**
     * 计算日
     *
     * @param timestamp
     * @return
     */
    private static int[] GetDay(int timestamp) {
        int daySeconds = 24 * 60 * 60;

        int day = timestamp / daySeconds;

        int remainSeconds = timestamp - day * daySeconds;

        return new int[]{day + 1, remainSeconds};
    }

    /**
     * 计算月
     *
     * @param timestamp
     * @param year
     * @return
     */
    private static int[] GetMonth(int timestamp, int year) {
        // 每天的秒数
        int daySeconds = 24 * 60 * 60;
        //每月的总秒数
        int[] monthDays = new int[]{31 * daySeconds, 28 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds};


        if (IsLeepYear(year))
            monthDays[1] = 29 * daySeconds;

        int totalSeconds = 0, month = 0;
        for (int second : monthDays) {
            month += 1;
            if (second + totalSeconds > timestamp)
                break;

            totalSeconds += second;
        }
        int remainSeconds = timestamp - totalSeconds;
        return new int[]{month, remainSeconds};
    }

    /**
     * 计算年
     *
     * @param timestamp
     * @return
     */
    private static int[] GetYear(int timestamp) {
        int year = 1969, totalSeconds = 0;

        while (true) {
            year += 1;
            int second = GetYearSeconds(year);
            //年份总秒数大于时间戳
            if (totalSeconds + second > timestamp)
                break;

            totalSeconds += second;

        }
        int remainSeconds = timestamp - totalSeconds;

        return new int[]{year, remainSeconds};
    }

    /**
     * 得到每一年的总秒数
     *
     * @param year
     * @return
     */
    private static int GetYearSeconds(int year) {
        if (IsLeepYear(year))
            return 366 * 24 * 60 * 60;
        else
            return 365 * 24 * 60 * 60;
    }


    /**
     * 判断闰年
     *
     * @param year
     * @return
     */
    private static boolean IsLeepYear(int year) {

        if (year % 4 == 0 && year % 100 != 0)
            return true;
        else if (year % 400 == 0)
            return true;
        else
            return false;
    }


}

 

Unix时间戳转日期时间格式,C#、Java、Python各语言实现!

标签:开始   bool   created   att   simple   import   ota   创建   strftime   

原文地址:http://www.cnblogs.com/chongsha/p/7069041.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!