之前有个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 / ; remainSeconds = timestamp - minute * ; 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 / ( * ); remainSeconds = timestamp - hour * * ; 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 = * * ; var day = timestamp / daySeconds; remainSeconds = timestamp - day * daySeconds; return day + ;
} /// <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 = * * ;
//每月的总秒数
var monthDays = new int[] { * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds }; if (IsLeepYear(year))
monthDays[] = * daySeconds; var totalSeconds = ;
var month = ;
foreach (var second in monthDays)
{
month += ;
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 = , totalSeconds = ; while (true)
{
year += ;
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 * * * ;
else
return * * * ;
} /// <summary>
/// 判断闰年
/// </summary>
/// <param name="year"></param>
/// <returns></returns>
private static bool IsLeepYear(int year)
{ if (year % == && year % != )
return true;
else if (year % == )
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各语言实现!的更多相关文章

  1. python转换时间戳和日期时间格式的转换

    [steven@txzxp2 seccenter]$ python Python 2.7.5 (default, Jul  8 2013, 09:48:59)  [GCC 4.8.1 20130603 ...

  2. python 日期、时间处理,各种日期时间格式/字符串之间的相互转换究竟是怎样的?

    模块函数说明 ''' date 日期对象,常用的属性有year,month,day time 时间对象,常用的属性有hour,minute,second,毫秒 datetime 日期时间对象,常用的属 ...

  3. c# DateTime时间格式和JAVA时间戳格式相互转换

    /// java时间戳格式时间戳转为C#格式时间 public static DateTime GetTime(long timeStamp) { DateTime dtStart = TimeZon ...

  4. [php基础]Mysql日期函数:日期时间格式转换函数详解

    在PHP网站开发中,Mysql数据库设计中日期时间字段必不可少,由于Mysql日期函数输出的日期格式与PHP日期函数之间的日期格式兼容性不够,这就需要根据网站实际情况使用Mysql或PHP日期转换函数 ...

  5. UNIX时间戳与日期的相互转换

    mysql中UNIX时间戳与日期的相互转换 UNIX时间戳转换为日期用函数:FROM_UNIXTIME() select FROM_UNIXTIME(1410318106); 日期转换为UNIX时间戳 ...

  6. db2 日期时间格式

    db2日期和时间常用汇总 1.db2可以通过SYSIBM.SYSDUMMY1.SYSIBM.DUAL获取寄存器中的值,也可以通过VALUES关键字获取寄存器中的值. SELECT 'HELLO DB2 ...

  7. Android日期时间格式国际化

    公共类 的DateFormatSymbols 扩展对象 实现 Serializable接口 Cloneable接口 java.lang.Object的    ↳ java.text.DateForma ...

  8. Eclipse 改动凝视的 date time 日期时间格式,即${date}变量格式

    Eclipse 改动凝视的 date time 日期时间格式,即${date}变量格式 找到eclipse安装文件夹以下的plugins文件夹,搜索 org.eclipse.text ,找到一个jar ...

  9. js中时间戳与日期时间之间的相互转换

    1.时间戳转换为标准日期时间格式: function timeFormat(dateStr) { var date = new Date(dateStr); Y = date.getFullYear( ...

随机推荐

  1. 2101244 - FAQ: SAP HANA Multitenant Database Containers (MDC)

    Symptom You face issues or have questions related to multitenant database containers in SAP HANA env ...

  2. Laravel数据库操作 Eloquent ORM

    模型首先在App目录下建立student的文件夹 里面放上 Student.php 且需要继承基类Model //允许批量赋值的字段// protected $fillable = ['name',' ...

  3. leetcode5

    public class Solution { private int lo, maxLen; public String LongestPalindrome(String s) { int len ...

  4. 为Firefox浏览器安装Firebug插件

    一.确保联网 二.打开Firefox 三.菜单:工具 -> 附加组件 显示附加组件管理器界面,点扩展 在搜索框输入firebug,搜,在搜索结果列表中找到Firebug项,安装 安装进度 安装完 ...

  5. C#简繁体转换

    /// <summary>/// 字符串简体转繁体/// </summary>/// <param name="strSimple"></ ...

  6. JavaScript: Constructor and Object Oriented Programming

    Constructor :  Grammar: object.constructor Example: Javascript code: 1 function obj1() { this.number ...

  7. jQuery formValidator API

    jQuery formValidator插件的API帮助 目前支持5种大的校验方式,分别是:inputValidator(针对input.textarea.select控件的字符长度.值范围.选择个数 ...

  8. centos6安装rabbitmq

    一.安装依赖包 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ k ...

  9. mongodb异常恢复

    构造mongdb异常 启动mongodb,bash mongodb.sh #!/bin/bash pid_file=/var/run/mongodb/mongod.pid pid_dir=/var/r ...

  10. logrotate-日志切割示例

    logrotate是linux系统自带的工具,它可以自动对日志进行截断(或轮循).压缩以及删除旧的日志文件. 1)配置文件示例# cat /wls/wls81/bin/weblogic/wls/app ...