为什么datepicker angular中的日期显示最后一天?

时间:2018-01-12 10:55:02

标签: javascript angular datepicker

我使用datepicker c角材料。这是代码:

<td [formGroup]="item">
 <div class="input-group">
  <div class="input-group-addon">
   <mat-datepicker-toggle mdSuffix [for]="picker"></mat-datepicker-toggle>
   <mat-datepicker #picker></mat-datepicker>
  </div>
  <input class="form-control" [matDatepicker]="picker" placeholder="Date" formControlName="date">
 </div>
</td>

Datapicker的格式是在发送时将其发送到服务器。

但问题是这些值是在最后一天传输的。

例如,我选择1/18/2018,但已发送到服务器2018-01-17T22: 00: 00.000Z

奇怪的是,日期的角度管道正确地转换日期,但在显示它之前,我在服务器上有一个请求按月分组,新月的第一天是在前一个月的最后一天

日期我存储在类型为Date的mongoose模式中。

也许有人对此有疑问。

谢谢。

7 个答案:

答案 0 :(得分:5)

我通过将datepicker日期值转换为UTC来解决此问题。这是一个例子:

const d = new Date(<DATE FROM FORM FIELD>);
const date = Date.UTC(d.getFullYear(), d.getMonth(), d.getDate());

也许它不是优雅的方法来解决它但帮助我

答案 1 :(得分:0)

我有类似的问题。我通过将Datepicker配置为使用UTC日期来解决它。 (默认情况下使用本地时间) 只需在您的组件声明上添加一些提供程序即可:

        import java.util.Scanner;
    public class Stackoverflow {
        public void newspaper() {
            System.out.println("Question 4 \n");

            double avg = 0;
            int sum = 0;
            int numYouth = 5;
            int youth[] = new int[numYouth];
            Scanner sc = new Scanner(System.in);
            // The loop for calculating the average
            for (int i = 0; i < 5; i++) {
                System.out.println("Youth " + i + " How many was delivered?");
                youth[i] = sc.nextInt();

                sum = sum + youth[i];
                avg = sum / numYouth;

            }
            System.out.println("Average is: " + avg + "\n");

            double aboveAvg = 0;

            // The loop for checking below of above average
            for (int j = 0; j < 5; j++) {
                if (youth[j] > avg) {
                    System.out.println("Youth " + j + " is above average");
                } else {
                    System.out.println("Youth " + j + " below average");

                }
            }
        }
        public static void main(String[] args) {
            new Stackoverflow().newspaper();
        }
    }

答案 2 :(得分:0)

与已接受的答案类似,但冗长一些,将保留小时/分钟/秒。

const dt = new Date(event.value);
const tz = dt.getTimezoneOffset();
const seconds = (dt.getTime() / 1000) - (tz * 60);

答案 3 :(得分:0)

您可以这样解决: 例如,如果您要在-> one_day_back_date_value

中获取日期
var one_day_back_date_value = moment.tz(moment(date_value_from_backend), 0).format("YYYY-MM-DD");
date_value_from_backend = moment(one_day_back_date_value).toDate();

请注意:必须为此 moment moment-timezone库。 在时刻-时区库上方包括 moment 库。

答案 4 :(得分:0)

如果您不使用moment或不想覆盖完整的date-datapter,则可以覆盖native-date-adapter

@Injectable({        providedIn: 'root' }) 
export class CustomDateAdapterService extends NativeDateAdapter {    
    public createDate(year: number, month: number, date: number): Date {
        const localDate = super.createDate(year, month, date);
        const offset = localDate.getTimezoneOffset() * 60000;
        return new Date(localDate.getTime() - offset); // utcDate
    } 
}

gist here

答案 5 :(得分:0)

尝试一下,它解决了问题,与日期选择器无关

echo str_replace('id=','',$_SERVER["QUERY_STRING"]);

答案 6 :(得分:0)

对于使用Moment的用户,此问题已解决:

https://github.com/angular/components/issues/7167#issuecomment-385416948