什么可能导致MySQL时间戳等于1969年12月31日

时间:2016-01-20 04:46:30

标签: php mysql datetime

在我运行的PHP站点中,users表有一个名为user_last_login的日期时间字段。

我不时注意到随机用户此字段的值为1969年12月31日,而其他数千名用户仍然存储了准确的日期。

以下PHP代码用于在登录时生成此值:

$user_last_login = strtotime($enrolled_user['user_last_login']);
$user_last_login = date( 'F j, Y | g:i a', $user_last_login );

可能导致此意外默认日期值的原因是什么?

编辑(显示代码):

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="Product")
public class Product implements Serializable{

    @Id
    @Column(name="productId")
    @GeneratedValue
    private Integer productId;

    @Column(name="productName")
    private String productName;

    @Column(name="productPrice")
    private int productPrice;


    //---------------------------------------item mapped to category------------------------------------------//
    @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinTable(
            name="CategoryProduct",
            joinColumns= @JoinColumn(name="productId")
    )
    private Category category;
    //--------------------------------------------------------------------------------------------------------//



    public Integer getProductId() {
        return productId;
    }

    public void setProductId(Integer productId) {
        this.productId = productId;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public int getProductPrice() {
        return productPrice;
    }

    public void setProductPrice(int productPrice) {
        this.productPrice = productPrice;
    }

    public Category getCategory() {
        return category;
    }

    public void setCategory(Category category) {
        this.category = category;
    }




}

3 个答案:

答案 0 :(得分:1)

如果将纪元(自纪元以来的秒数)转换为日期,通常会得到一个合理的值:

例如:

echo date('Y-m-d H:i:s', 1453266106); //2016-01-20 00:01:46

但是如果传入0,则会得到纪元的日期:

echo date('Y-m-d H:i:s', 0); // 1969-12-31 19:00:00

检查您的代码,了解您要更新user_last_login的任何其他位置,并将第二个(整数)参数传递给date

答案 1 :(得分:1)

不再是 Wild Shot

date("Y-m-d H:i:s")

因此,您要以适当的MySQL日期时间格式存储日期。您的显示有时会显示

December 31, 1969

这意味着您显然 以不同的格式显示 。因此,用于转换该日期的代码存在问题。最有可能的问题是月份是先到还是先来。查看该代码,当您的代码占用一个月的日期时,您会看到发生了什么,这会导致错误,然后将打印日期默认为unix时代。

您还可以通过运行查询来查看所有存储的日期时间值来验证此假设,如果您始终使用date("Y-m-d H:i:s")来存储日期,则 腐败绝对不可能 有时是随机的。

上次登录:从不;)就是答案。

答案 2 :(得分:-1)

看起来您的时间可能偶尔会无效。见Prevent PHP date() from defaulting to 12/31/1969

您可以先尝试检查时间(如链接所示),然后再插入它以防止这种情况发生。但是你仍然需要弄清楚为什么它有时会无效。为此,您需要更好地了解时间的来源。